Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

πŸ› οΈ [refactor] 학생-μˆ˜μ—… 캐싱 μ „λž΅μ„ λ‹¨μˆœ Set μ €μž₯으둜 λ³€κ²½ #65

Open
2 tasks
binary-ho opened this issue Aug 23, 2023 · 0 comments
Labels
Refactor λ¦¬νŒ©ν† λ§

Comments

@binary-ho
Copy link
Owner

πŸ› οΈ λ¦¬νŒ©ν† λ§μ΄ ν•„μš”ν•œ λΆ€λΆ„

κΈ°μ‘΄ κ΅¬ν˜„

ν˜„μž¬ λ©”λͺ¨λ¦¬λ₯Ό 아끼기 μœ„ν•΄, 학생-μˆ˜μ—… 데이터가 1개인 경우, String으둜 μ €μž₯ν•˜κ³ ,
학생이 듀을 수 μžˆλŠ” μˆ˜μ—…μ΄ 2κ°œκ°€ 될 λ•Œ λΆ€ν„°λŠ” set으둜 μ €μž₯ν•˜κ³  μžˆλ‹€.

μ΄λ ‡κ²Œ κ΅¬ν˜„ν•œ μ΄μœ λŠ” 두 가지 μ΄μœ μ—μ„œμΈλ°,

  1. λŒ€λΆ€λΆ„μ˜ μƒν™©μ—μ„œ 학생은 (μ‹œκ°„μ μœΌλ‘œ) ν•œλ²ˆμ— ν•œ μˆ˜μ—…μ—λ§Œ μΆœμ„ν•œλ‹€.
    정말 μš°μ—°μ˜ 일치둜 학생이 잘λͺ» μ‹ μ²­ν•˜κ³ , 강사가 잘λͺ» μŠΉμΈν•˜λŠ” κ²½μš°μ—λ‚˜, 두 가지 μ΄μƒμ˜ μˆ˜μ—…μ— μΆœμ„ κ°€λŠ₯ν•œ 상황이 λ²Œμ–΄μ§„λ‹€.
  2. 기본적으둜 set이 데이터λ₯Ό 더 μ‚¬μš©ν•œλ‹€. μ–΄μ°Œλ³΄λ©΄ λ‹Ήμ—°ν•œλ°, 데이터λ₯Ό ν•˜λ‚˜λ§Œ μ €μž₯ν–ˆμ„ λ•Œ μ•½ 100 λ°”μ΄νŠΈ 정도 차이났닀. (λ¬Όλ‘  κΈ€μž μˆ˜μ— 따라 λ‹¬λΌμ§ˆ 수 μžˆλ‹€) Set을 κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄ μ•½ 50 λ°”μ΄νŠΈ 보닀 적은 μ˜€λ²„ν—€λ“œκ°€ μžˆλŠ” κ²ƒμœΌλ‘œ μΆ”μ •λœλ‹€.

λ”°λΌμ„œ, 데이터가 없을 λ•ŒλŠ” String으둜 μ €μž₯ν•˜κ³ , 읽고

2개일 λ•Œ λΆ€ν„°λŠ” Set으둜 μ €μž₯ν•˜κ³  읽도둝 κ΅¬ν˜„ν•΄ λ‘μ—ˆλ‹€.

μ •ν™•νžˆλŠ” ν˜„μž¬ λ°μ΄ν„°μ˜ μ €μž₯ type을 ν™•μΈν•΄μ„œ, type에 따라 λ‹€λ₯Έ μ €μž₯-읽기 정책을 μˆ˜ν–‰ν•˜κ³  μžˆλŠ” 것이닀.

문제 상황

λ¬Έμ œλŠ” ν…ŒμŠ€νŠΈμ‹œ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” 것을 ν™•μΈν–ˆλ‹€.

겨우 1만개 데이터λ₯Ό μ €μž₯ν•˜λŠ”λ° μ–ΌμΆ” 2 ~ 3회의 μ˜ˆμ™Έκ°€ λ°œμƒν–ˆκ³ , ν•΄λ‹Ή λ°μ΄ν„°λŠ” μ €μž₯λ˜μ§€ μ•Šμ•˜λ‹€.

μ΄μœ λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œμ§€λ§Œ, 이벀트 λ£¨ν”„λ‘œ μ²˜λ¦¬λ˜λŠ” λ ˆλ””μŠ€ νŠΉμ„±μƒ type을 ν™•μΈν•˜κ³  μ €μž₯ν•˜λŠ” 사이에 이미 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ°”λ€Œμ–΄ μ½λŠ” 방식이 λ°”λ€Œμ–΄λ²„λ ΈκΈ° 떄문이닀.

set인데, string으둜 μ½κ±°λ‚˜ μ €μž₯ν•˜λŠ” 연산을 μˆ˜ν–‰ν•œ 것이닀.

ν•΄κ²°

λ‹€μ–‘ν•œ 방법을 κ³ λ €ν–ˆλ‹€.

  1. μ‹€νŒ¨ν•˜λŠ” 경우 리트라이 ν•œλ‹€. -> 닀루기 κΉŒλ‹€λ‘­λ‹€. μ •ν™•νžˆ μ˜ˆμΈ‘ν•˜κΈ° νž˜λ“  상황인데, 계속 방법을 λ°”κΏ”κ°€λ©΄μ„œ 리트라이 ν•˜λŠ” 것은 μœ„ν—˜ν•΄ λ³΄μ˜€λ‹€.
  2. νƒ€μž… 확인과 μ €μž₯ 과정이 ν•œλ²ˆμ— 이루어지도둝 κ΅¬ν˜„ -> μΌμ’…μ˜ 락이 κ±Έλ €μ•Ό 할텐데, λΉ λ₯Έ 캐싱이 더 μ€‘μš”ν•œ 상황이라, 맀λ ₯적으둜 λ‹€κ°€μ˜€μ§€ μ•Šμ•˜λ‹€.
  3. 방치 -> λ°©μΉ˜ν•˜λŠ” 것도 방법이닀 1만건 쀑 단 1, 2건이기 λ•Œλ¬Έμ΄λ‹€.
    ν•˜μ§€λ§Œ 학생이 2개 μ΄μƒμ˜ μˆ˜μ—…μ— 등둝 λ˜μ–΄μžˆλŠ” μƒν™©μ—μ„œ, μΊμ‹œ 데이터가 μ•„μ˜ˆ μ—†λ‹€λ©΄ DBμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ μ—†μ§€λ§Œ, μ—¬λŸ¬κ°œ 쀑 ν•˜λ‚˜λ§Œ λˆ„λ½λœλ‹€λ©΄, DBλ₯Ό κ±°μΉ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 사싀상 μΊμ‹œ 데이터가 μ§€μ›Œμ§€κΈ° μ „κΉŒμ§„ μΆœμ„μ΄ λΆˆκ°€λŠ₯ν•  μˆ˜λ„ μžˆλ‹€.
  4. λ”°λΌμ„œ μ΅œμ’…μ μœΌλ‘œ μ• μ΄ˆμ— Set으둜 μ €μž₯ν•˜κΈ°λ‘œ κ²°μ •ν–ˆλ‹€. -> 읽고 μ“°λŠ” 방식을 톡일

νŠΈλ ˆμ΄λ“œ μ˜€ν”„λ‘œ ν¬κΈ°ν•˜κ²Œ λ˜λŠ” 것은 μš©λŸ‰μ΄λ‹€. 이에, κΈ°μ‘΄ max-memroyλ₯Ό 2MBμ—μ„œ 5MB둜 λŠ˜λ Έλ‹€.

λ©”λͺ¨λ¦¬κ°€ 1GiB인 μ„œλ²„ μŠ€νŽ™μƒ μ΄μ •λ„λŠ” κ°μˆ˜ν•  λ§Œν•˜λ‹€κ³  μƒκ°λ˜μ—ˆλ‹€.

그리고 크기λ₯Ό 직접 비ꡐ해본 κ²°κ³Ό (맀우 보수적으둜 비ꡐ) 일단 string만 μžˆμ„ λ•Œ 보닀 μ•½ 100 λ°”μ΄νŠΈ μ •λ„μ˜ 크기 차이가 났닀.

μ•½ 208 λ°”μ΄νŠΈκ°€ λ‚˜μ™”λŠ”λ°, key와 value의 길이에 따라 달라진닀고 μƒκ°ν•΄μ„œ 300 λ°”μ΄νŠΈλΌκ³  가정해도, 1만λͺ… λ™μ‹œ μΊμ‹±μ‹œ 3MBκ°€ μ•ˆλœλ‹€. μ΄λŠ” λ™μ‹œμ— 1만λͺ…이 μΆœμ„ν•  수 μžˆλŠ” 양이닀.

λ‚΄ μ„œλ²„μ˜ ν˜„μž¬ λͺ©ν‘œλŠ” 1000λͺ… λ™μ‹œ μΆœμ„μ΄κΈ° λ•Œλ¬Έμ— μ°¨κ³  λ‚¨λŠ”λ‹€.

λ‚˜λ¨Έμ§€ 2MBλŠ” 1만λͺ…이 λ™μ‹œμ— κ°€μž…ν–ˆμ„ λ•Œ 이메일 인증으둜 μ“°κΈ° μœ„ν•΄ 남겨 λ‘μ—ˆλ‹€.

λ¦¬νŒ©ν† λ§ μž‘μ—… 브랜치

feature/save-attendee-as-set

β˜‘ Refactoring TODO

  • Attendee의 Redis Read/Cacheμ „λž΅ Enum을 μ‚­μ œν•œλ‹€
  • Attendee Cache 데이터λ₯Ό Set을 톡해 μ €μž₯ν•˜κ³  μ½λŠ” λ°©μ‹μœΌλ‘œ ν†΅μΌν•œλ‹€
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Refactor λ¦¬νŒ©ν† λ§
Projects
None yet
Development

No branches or pull requests

1 participant