Skip to content

Latest commit

Β 

History

History
205 lines (106 loc) Β· 11.9 KB

Redis.md

File metadata and controls

205 lines (106 loc) Β· 11.9 KB

Redis(REmote DIctionary Server)

νŒŒλ ˆν† μ˜ 법칙 : 우리 μ‚¬νšŒμ—μ„œ μΌμ–΄λ‚˜λŠ” ν˜„μƒμ˜ 80%λŠ” 20%의 μ›μΈμœΌλ‘œ 인해 λ°œμƒλ¨μ„ λœ»ν•˜λŠ” 법칙

μ›Ή μ‚¬μ΄νŠΈμ— λŒ€ν•œ 접근도 νŒŒλ ˆν† μ˜ 법칙이 λ”± λ“€μ–΄λ§žμ•„, 인터넷 ν†΅μ‹ μ˜ 80%κ°€ 뢈과 20%의 μ‚¬μ΄νŠΈμ— λŒ€ν•œ μ•‘μ„ΈμŠ€λ‘œ μΆ”μ •λ˜λ©°, 이 20%의 μ›Ήμ‚¬μ΄νŠΈ 데이터λ₯Ό μΊμ‹œν•΄λ‘λ©΄ νš¨μœ¨μ„ 극적으둜 ν–₯상할 수 μžˆλ‹€

λ”°λΌμ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” λ°μ΄ν„°λŠ” λ ˆλ””μŠ€λ₯Ό μ΄μš©ν•˜μ—¬ μΊμ‹œλ‘œ μ €μž₯ν•΄ λ‘λŠ” 것이 λ¦¬μ†ŒμŠ€λ₯Ό 효율적으둜 μ΄μš©ν•  수 μžˆλŠ” 방법이 될 수 μžˆμ„ 것


λ ˆλ””μŠ€λŠ” 어디에 μ‚¬μš©ν• κΉŒ?

  • 운영 쀑인 μ›Ή μ„œλ²„μ—μ„œ ν‚€-κ°’ ν˜•νƒœμ˜ 데이터 νƒ€μž…μ„ μ²˜λ¦¬ν•˜κ³ , I/Oκ°€ 빈번히 λ°œμƒν•΄ λ‹€λ₯Έ μ €μž₯ 방식을 μ‚¬μš©ν•˜λ©΄ 효율이 λ–¨μ–΄μ§€λŠ” κ²½μš°μ— μ‚¬μš©ν•©λ‹ˆλ‹€.
    • μ‘°νšŒμˆ˜λ‚˜ 카운트 ν˜•νƒœμ˜ 데이터
  • μ‚¬μš©μžμ˜ μ„Έμ…˜ 관리
    • μ‚¬μš©μžμ˜ μ„Έμ…˜μ„ μœ μ§€ν•˜κ³  뢈러였고, μ—¬λŸ¬ ν™œλ™λ“€μ„ μΆ”μ ν•˜λŠ”κ²Œ 맀우 효과적 μž…λ‹ˆλ‹€.
  • API 캐싱
    • 라우트둜 λ“€μ–΄μ˜¨ μš”μ²­μ— λŒ€ν•΄ μš”μ²­ 값을 μΊμ‹±ν•˜λ©΄ 동일 μš”μ²­μ— λŒ€ν•΄ μΊμ‹±λœ 데이터λ₯Ό λ¦¬ν„΄ν•˜λŠ” 방식

λ ˆλ””μŠ€λŠ” In-Memory λ°μ΄ν„°λ² μ΄μŠ€μž…λ‹ˆλ‹€.

즉, λͺ¨λ“  데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³  μ‘°νšŒν•©λ‹ˆλ‹€. κΈ°μ‘΄ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(Oracle, MySQL) 보닀 훨씬 λΉ λ₯Έλ° κ·Έ μ΄μœ λŠ” λ©”λͺ¨λ¦¬ 접근이 λ””μŠ€ν¬ 접근보닀 λΉ λ₯΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λΉ λ₯΄λ‹€λŠ” 것은 λ ˆλ””μŠ€μ˜ μ—¬λŸ¬ νŠΉμ§• 쀑 μΌλΆ€λΆ„μž…λ‹ˆλ‹€.

λ‹€λ₯Έ In-Memory λ°μ΄ν„°λ² μ΄μŠ€(ex. Memcached) μ™€μ˜ κ°€μž₯ 큰 차이점은 λ‹€μ–‘ν•œ 자료ꡬ쑰 λ₯Ό μ§€μ›ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ ˆλ””μŠ€λŠ” μ•„λž˜μ²˜λŸΌ λ‹€μ–‘ν•œ 자료ꡬ쑰λ₯Ό Key-Value ν˜•νƒœλ‘œ μ €μž₯ν•©λ‹ˆλ‹€.


IMAGES


λ ˆλ””μŠ€λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ•„λ‹™λ‹ˆλ‹€. λ ˆλ””μŠ€λŠ” 기본적으둜 String, Bitmap, Hash, List, Set, Sorted Set λ₯Ό μ œκ³΅ν–ˆκ³ , 버전이 μ˜¬λΌκ°€λ©΄μ„œ ν˜„μž¬λŠ” Geospatial Index, Hyperloglog, Stream λ“±μ˜ μžλ£Œν˜•λ„ μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ΄λ ‡κ²Œ λ‹€μ–‘ν•œ 자료ꡬ쑰λ₯Ό μ œκ³΅ν•˜λŠ”κ²Œ μ™œ μ€‘μš”ν• κΉŒμš”?

λ°”λ‘œΒ κ°œλ°œμ˜ νŽΈμ˜μ„±κ³Ό λ‚œμ΄λ„Β λ•Œλ¬Έμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ‹€μ‹œκ°„ λž­ν‚Ή μ„œλ²„λ₯Ό κ΅¬ν˜„ν•  λ•Œ κ΄€κ³„ν˜• DBMSλ₯Ό μ΄μš©ν•œλ‹€λ©΄ DB에 데이터λ₯Ό μ €μž₯ν•˜κ³ , μ €μž₯된 SCORE κ°’μœΌλ‘œ μ •λ ¬ν•˜μ—¬ λ‹€μ‹œ μ½μ–΄μ˜€λŠ” 과정이 ν•„μš”ν•  κ²ƒμž…λ‹ˆλ‹€. κ°œμˆ˜κ°€ λ§Žμ•„μ§€λ©΄ 속도가 느렀질 ν…λ°μš”, 이 κ³Όμ •μ—μ„œ λ””μŠ€ν¬λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. In-memory 기반으둜 μ„œλ²„μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ 직접 μ½”λ“œλ₯Ό μ§€ μˆ˜λ„ μžˆκ² μ§€λ§Œ.. λ ˆλ””μŠ€μ˜ Sorted-Set(Replicatoin)을 μ΄μš©ν•˜λŠ”κ²Œ 더 λΉ λ₯΄κ³  κ°„λ‹¨ν•œ 방법일 κ²ƒμž…λ‹ˆλ‹€


IMAGES


λ ˆλ””μŠ€λŠ” νŠΈλžœμž­μ…˜μ˜ λ¬Έμ œλ„ ν•΄κ²°ν•΄ 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

Redis μžλ£Œκ΅¬μ‘°λŠ” Atomic ν•˜λ‹€λŠ” νŠΉμ§• λ•Œλ¬Έμ— race condition 을 ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

즉, Redis Transaction 은 ν•œλ²ˆμ˜ λ”± ν•˜λ‚˜μ˜ λͺ…λ Ήλ§Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이에 λ”ν•˜μ—¬ single-threaded νŠΉμ„± 을 μœ μ§€ν•˜κ³  있기 λ•Œλ¬Έμ— λ‹€λ₯Έ μŠ€ν† λ¦¬μ§€ ν”Œλž«νΌλ³΄λ‹€λŠ” μ΄μŠˆκ°€ λœν•˜λ‹€κ³  ν•©λ‹ˆλ‹€

즉, μ™ΈλΆ€μ˜ Collections을 잘 μ΄μš©ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ 개발 μ‹œκ°„ 단좕이 κ°€λŠ₯ν•˜κ³ , μƒκ°ν•˜μ§€ λͺ»ν•œ μ—¬λŸ¬κ°€μ§€ 문제λ₯Ό 쀄여쀄 수 μžˆμœΌλ―€λ‘œ κ°œλ°œμžλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑할 수 μžˆλ‹€λŠ” 큰 μž₯점이 μ‘΄μž¬ν•©λ‹ˆλ‹€


λ ˆλ””μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” 자료ꡬ쑰

string

κ°€μž₯ 일반적인 ν˜•νƒœλ‘œ, key - value 둜 μ €μž₯ν•˜λŠ” ν˜•νƒœμ΄λ‹€.

string νƒ€μž…μ—λŠ” λͺ¨λ“  μ’…λ₯˜μ˜ λ¬Έμžμ—΄(이진 데이터 포함) 을 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ JPEG 이미지λ₯Ό μ €μž₯ν•˜κ±°λ‚˜, HTML fragment λ₯Ό μΊμ‹œν•˜λŠ” μš©λ„λ‘œ 자주 μ‚¬μš©ν•©λ‹ˆλ‹€

list

λ ˆλ””μŠ€μ˜ listλŠ” 일반적인 linked list 의 νŠΉμ§•μ„ κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ list 내에 수백만 개의 μ•„μ΄ν…œμ΄ μžˆλ”λΌλ„ head와 tail에 값을 μΆ”κ°€ν•  λ•Œ λ™μΌν•œ μ‹œκ°„μ΄ μ†Œμš”λ©λ‹ˆλ‹€. νŠΉμ • κ°’μ΄λ‚˜ 인덱슀둜 데이터λ₯Ό μ°Ύκ±°λ‚˜ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

HASH

hashλŠ” field-value μŒμ„ μ‚¬μš©ν•œ 일반적인 ν•΄μ‹œμž…λ‹ˆλ‹€. key에 λŒ€ν•œ filed의 κ°―μˆ˜μ—λŠ” μ œν•œμ΄ μ—†μœΌλ―€λ‘œ μ—¬λŸ¬ λ°©λ²•μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

field와 value둜 κ΅¬μ„±λœλ‹€λŠ” λ©΄μ—μ„œ hashλŠ” RDB의 tableκ³Ό λΉ„μŠ·ν•©λ‹ˆλ‹€.

set

set은 μ •λ ¬λ˜μ§€ μ•Šμ€ λ¬Έμžμ—΄μ˜ λͺ¨μŒμž…λ‹ˆλ‹€. 일반적인 set이 그렇듯이, μ•„μ΄ν…œμ€ 쀑볡될 수 μ—†μŠ΅λ‹ˆλ‹€. ꡐ집합, ν•©μ§‘ν•©, μ°¨μ§‘ν•© 연산을 λ ˆλ””μŠ€μ—μ„œ μˆ˜ν–‰ν•  수 있기 λ•Œλ¬Έμ— set은 객체 κ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•  λ•Œ μ’‹μŠ΅λ‹ˆλ‹€.

sorted set

sorted set은 setκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ key ν•˜λ‚˜μ— μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μ—¬λŸ¬ 멀버λ₯Ό μ €μž₯ν•˜μ§€λ§Œ, 각각의 λ©€λ²„λŠ” μŠ€μ½”μ–΄μ— μ—°κ²°λ©λ‹ˆλ‹€. λͺ¨λ“  λ°μ΄ν„°λŠ” 이 κ°’μœΌλ‘œ μ •λ ¬λ˜λ©°, μŠ€μ½”μ–΄κ°€ κ°™λ‹€λ©΄ λ©€λ²„κ°’μ˜ μ‚¬μ „μˆœμ„œλ‘œ μ •λ ¬λ©λ‹ˆλ‹€. sorted set은 주둜 sortκ°€ ν•„μš”ν•œ 곳에 μ‚¬μš©λ©λ‹ˆλ‹€.

sorted set은 μ •λ ¬λœ ν˜•νƒœλ‘œ μ €μž₯되기 λ•Œλ¬Έμ— λ•Œλ¬Έμ— 인덱슀λ₯Ό μ΄μš©ν•˜μ—¬ λΉ λ₯΄κ²Œ μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Collection 주의 사항

  • ν•˜λ‚˜μ˜ μ»¬λ ‰μ…˜μ— λ„ˆλ¬΄ λ§Žμ€ μ•„μ΄ν…œμ„ λ‹΄μœΌλ©΄ μ’‹μ§€ μ•Šλ‹€.
    • 10000개 μ΄ν•˜ λͺ‡μ²œκ°œ μˆ˜μ€€μœΌλ‘œ μœ μ§€ν•˜λŠ”κ²Œ μ’‹λ‹€.
  • ExpireλŠ” Collection의 item κ°œλ³„λ‘œ 걸리지 μ•Šκ³  전체 Collection에 λŒ€ν•΄μ„œλ§Œ κ±Έλ¦°λ‹€.
    • ν•΄λ‹Ή 10000개의 μ•„μ΄ν…œμ„ κ°€μ§„ Collection에 expireκ°€ κ±Έλ €μžˆλ‹€λ©΄ κ·Έ μ‹œκ°„ 후에 10000개의 μ•„μ΄ν…œμ΄ λͺ¨λ‘ μ‚­μ œ.

Redis Key

λ ˆλ””μŠ€μ˜ ν‚€λŠ” λ¬Έμžμ—΄μ΄κΈ° λ•Œλ¬Έμ— 'abc'λΆ€ν„° JPEG νŒŒμΌκΉŒμ§€ λͺ¨λ“  이진 μ‹œν€€μŠ€λ₯Ό ν‚€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 빈 λ¬Έμžμ—΄λ„ ν‚€κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. string νƒ€μž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ ν—ˆμš©λ˜λŠ” μ΅œλŒ€ ν‚€ ν¬κΈ°λŠ” 512MBμž…λ‹ˆλ‹€.

ν‚€λ₯Ό μ‘°νšŒν•  λ•Œμ˜ λΉ„μš©μ„ μƒκ°ν•˜λ©΄, ν‚€λ₯Ό λ„ˆλ¬΄ 길게 μ‚¬μš©ν•˜λŠ” 것은 ꢌμž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Expire κΈ°λŠ₯

킀와 κ΄€λ ¨λœ μ€‘μš”ν•œ κΈ°λŠ₯인 Expire에 λŒ€ν•΄μ„œλ„ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. λ ˆλ””μŠ€λŠ” in-memory DB인 만큼, λ©”λͺ¨λ¦¬μ— μ €μž₯될 수 μžˆλŠ” λ°μ΄ν„°λŠ” ν•œμ •μ μž…λ‹ˆλ‹€.

더이상 λ©”λͺ¨λ¦¬μ— 데이터λ₯Ό μ €μž₯ν•  수 μ—†λŠ” 경우 λ ˆλ””μŠ€μ—μ„œλŠ” κ°€μž₯ λ¨Όμ € λ“€μ–΄μ˜¨ 데이터λ₯Ό μ‚­μ œν•˜κ±°λ‚˜, κ°€μž₯ μ΅œκ·Όμ— μ‚¬μš©λ˜μ§€ μ•Šμ€ 데이터λ₯Ό μ‚­μ œν•˜κ±°λ‚˜, ν˜Ήμ€ 더이상 데이터λ₯Ό μž…λ ₯λ°›μ§€ λͺ»ν•˜κ²Œ λ©λ‹ˆλ‹€.

κ°€μž₯ 쒋은 방법은 μ‚­μ œλ˜λŠ” 데이터λ₯Ό λ ˆλ””μŠ€μ—κ²Œ λ§‘κΈ°μ§€ μ•Šκ³ , 직접 μ„€μ •ν•˜λŠ” 것일 κ²λ‹ˆλ‹€.

ν•΄λ‹Ή 데이터λ₯Ό μž…λ ₯ν•  λ•Œ 이 λ°μ΄ν„°μ˜ μ‚¬μš© κΈ°ν•œμ΄ μ–Έμ œκΉŒμ§€μΈμ§€λ₯Ό 직접 μ„€μ •ν•΄ μ€ŒμœΌλ‘œμ„œ, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 직접 λ°μ΄ν„°μ˜ μ‚¬μš© 만료 μ‹œκ°„μ„ μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ°„λ‹¨νžˆ 킀에 λŒ€ν•œ timeout을 μ„€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ„€μ •λœ timeout μ‹œκ°„μ΄ κ²½κ³Όν•˜λ©΄ 킀에 λŒ€ν•΄ DEL λͺ…λ Ήμ–΄λ₯Ό ν˜ΈμΆœν•œ κ²ƒμ²˜λŸΌ ν‚€κ°€ μžλ™μœΌλ‘œ μ‚­μ œλ©λ‹ˆλ‹€.

λͺ‡μ΄ˆ 뒀에 μ‚­μ œλ˜μ–΄μ•Ό ν•œλ‹€κ³  남은 μ‹œκ°„κ°’μ„ μ΄μš©ν•˜κ±°λ‚˜, ν˜Ήμ€ μœ λ‹‰μŠ€μ˜ timestampλ₯Ό μ‚¬μš©ν•΄μ„œ μ‚­μ œλ˜μ–΄μ•Ό ν•˜λŠ” μ‹œκ°μ„ μ„€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.


Redis 운영

- λ©”λͺ¨λ¦¬ 관리λ₯Ό μž˜ν•˜μž.

  • RedisλŠ” In-Memory Data Store -In-Memory Cache λ‹€ λ³΄λ‹ˆ, λ©”λͺ¨λ¦¬ 보닀 더 λ§Žμ€ 데이터λ₯Ό μ¨μ„œ swap이 λ°œμƒν•˜λ©΄ ν•΄λ‹Ή λ©”λͺ¨λ¦¬ pageλ₯Ό μ ‘κ·Όν•  λ•Œ λ§ˆλ‹€ swap out 이 λ°œμƒν•΄μ„œ, 속도에 μ—„μ²­λ‚œ 영ν–₯을 주게 λ©λ‹ˆλ‹€.

  • Maxmemory, Maxmemory-policy

    • Maxmemory: λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ μ œν•œ, Maxmemory-policy: Maxmemory μˆ˜μΉ˜κΉŒμ§€ λ©”λͺ¨λ¦¬κ°€ λ‹€ μ°¨λŠ” 경우 Maxmemory policy에 따라 μΆ”κ°€ λ©”λͺ¨λ¦¬λ₯Ό 확보
  • RSS 값을 λͺ¨λ‹ˆν„°λ§ 해야함

    • RSS 값은 데이터λ₯Ό ν¬ν•¨ν•΄μ„œ μ‹€μ œλ‘œ Redisκ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬μΈλ°, 이 값은 μ‹€μ œλ‘œ μ‚¬μš©ν•˜κ³  μžˆλŠ” used-memory 값보닀 클 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν˜„μƒμ΄ λ°œμƒν•˜λŠ” μ΄μœ λŠ” OSκ°€ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  λ•Œ page μ‚¬μ΄μ¦ˆμ˜ 배수만큼 ν• λ‹Ήν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ page size = 4096 인데, μš”μ²­ λ©”λͺ¨λ¦¬ μ‚¬μ΄μ¦ˆκ°€ 10이라고 ν•˜λ©΄ OSλŠ” 4096λ§ŒνΌμ„ ν• λ‹Ήν•©λ‹ˆλ‹€. 이λ₯Ό νŒŒνŽΈν™” ν˜„μƒμ΄λΌκ³  ν•˜λŠ”λ° 이것이 μ‹€μ œ μ‚¬μš©ν•œ λ©”λͺ¨λ¦¬λž‘ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬κ°€ λ‹€λ₯Έ 원인이 λ©λ‹ˆλ‹€.

- O(N) κ΄€λ ¨ λͺ…λ Ήμ–΄λŠ” μ£Όμ˜ν•˜μž.

Redis λŠ” Single Threaded 이닀. λ”°λΌμ„œ λ ˆλ””μŠ€κ°€ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλŠ” λͺ…λ Ή κ°―μˆ˜λŠ” ν•œλ²ˆμ— 1κ°œμ΄λ‹€. ν•˜μ§€λ§Œ μƒκ°λ§ŒνΌ κ·Έλ ‡κ²Œ 느린건 μ•„λ‹Œκ²Œ, λ‹¨μˆœν•œ get / set 의 경우, Redis λŠ” μ΄ˆλ‹Ή 10만개λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  ν•œλ‹€.

ν•˜μ§€λ§Œ μ£Όμ˜ν•  점도 μžˆλŠ”κ²Œ, single-threaded 이기 λ•Œλ¬Έμ— 처리 μ‹œκ°„μ΄ κΈ΄ λͺ…λ Ήμ–΄κ°€ λ“€μ–΄μ˜€λ©΄ κ·Έ λ’€ λͺ…령어듀은 μ „λΆ€ λŒ€κΈ°κ°€ ν•„μš”ν•˜λ‹€. 즉, λ§Œμ•½ 1κ°œμ— 1μ΄ˆκ°€ κ±Έλ¦¬λŠ” μž‘μ—…μ„ ν•˜κ²Œ λ˜λ²„λ¦¬λ©΄? μ΅œμ•…μ˜ 경우 99999 개의 λͺ…령은 1μ΄ˆλ™μ•ˆ κ·Έλƒ₯ λŒ€κΈ°ν•΄μ•Ό ν•˜λŠ” 것이닀. 이런건 99999개의 νƒ€μž„μ•„μ›ƒμ΄ λ°œμƒν•  수 μžˆλŠ” 상황이닀.


IMAGES


TCP μ—μ„œλŠ” νŒ¨ν‚·μ΄ λŠμ–΄μ Έμ„œ 올 수 μžˆλ‹€. μ΄λŸ΄λ•Œ νŒ¨ν‚·μ΄ λ“€μ–΄μ™€μ„œ λͺ…λ Ή ν•˜λ‚˜λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” 과정이 μ–΄λ–»κ²Œ μˆ˜ν–‰λ˜λŠ”μ§€ μ •λ¦¬ν•˜μ˜€λ‹€.

νŒ¨ν‚· ν•˜λ‚˜κ°€ λ“€μ–΄μ˜€λ©΄ processInputBuffer μ—μ„œ νŒ¨ν‚·μ„ ν•˜λ‚˜μ˜ command 둜 λ§Œλ“ λ‹€. command κ°€ μ™„μ„±λλŠ”μ§€ ν™•μΈν•˜κ³  command κ°€ μ™„μ„±λ˜μ—ˆμœΌλ©΄ processCommandAndReset μ΄λΌλŠ” κ±Έ ν•΄μ„œ λ‹€μ‹œ 타고 λ“€μ–΄μ˜¨ ν›„ κ·Έ μ‹œμ μ— μ™„μ„±λœ command ν•˜λ‚˜λ₯Ό κ·Έλƒ₯ μ‹€ν–‰μ‹œμΌœλ²„λ¦°λ‹€. λ”°λΌμ„œ 이런 μƒν™©μ—μ„œ ν•΄λ‹Ή νŒ¨ν‚· ν•˜λ‚˜κ°€ μ²˜λ¦¬λ˜λŠ” λ™μ•ˆ λ’€μ˜ νŒ¨ν‚·μ€ 아무것도 λͺ»ν•˜κ³  κ·Έλƒ₯ μŒ“μ΄λŠ” 것이닀. 이후 νŒ¨ν‚· μ²˜λ¦¬κ°€ μ™„λ£Œλ˜μ–΄ 루프λ₯Ό νƒˆμΆœν•΄μ•Όλ§Œ λ‹€μ‹œ κ·Έ λ‹€μŒ λͺ…λ Ή (packet -> command) 듀을 μ²˜λ¦¬ν•  수 μžˆλ‹€.

μ΄λŸ¬ν•œ λ™μž‘ κ³Όμ •μ—μ„œ μ•Œ 수 μžˆλ“― Redis λŠ” ν•œλ²ˆμ— ν•˜λ‚˜μ˜ λͺ…λ Ήλ§Œ μ‹€ν–‰ν•  수 있기 λ•Œλ¬Έμ— κΈ΄ μ²˜λ¦¬μ‹œκ°„μ„ μš”ν•˜λŠ” λͺ…λ Ήμ–΄λ₯Ό μ“°λ©΄ λΆˆλ¦¬ν•˜λ‹€. 그럼 보톡 'κΈ΄' λͺ…령이 될 수 μžˆλŠ”, λŒ€ν‘œμ μΈ O(N) λͺ…령듀은 무엇이 μžˆμ„κΉŒ.

KEYS : λͺ¨λ“  μ•„μ΄ν…œμ„ μˆœνšŒν•˜λŠ” λͺ…령이닀. ν•˜μ§€λ§Œ μ•„μ΄ν…œμ΄ λ§Žμ•„μ§€λ©΄ μ„œλ²„μ—μ„œ exception 을 νŠΈλ¦¬κ±°ν•˜λ‹ˆ μ£Όμ˜ν•΄μ•Όν•œλ‹€. 예λ₯Ό λ“€μ–΄, Key κ°€ 백만개 이상인데 확인을 μœ„ν•΄ KEYS λͺ…령을 μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” κ²°κ΅­ λͺ¨λ‹ˆν„°λ§ μŠ€ν¬λ¦½νŠΈκ°€ μΌμ΄ˆμ— ν•œλ²ˆμ”© 이걸 ν˜ΈμΆœν•˜κ²Œ λ˜λŠ” 것이닀. 😭

FLUSHALL, FLUSHDB : 데이터λ₯Ό λ‹€ λ‚ λ¦°λ‹€.

Delete Collections : Collection λ‚΄ μ•„μ΄ν…œμ„ μ „λΆ€ μ‚­μ œν•˜λŠ” λͺ…령이닀. 예λ₯Ό λ“€μ–΄ 100만개 μ•„μ΄ν…œ μ‚­μ œλ₯Ό μ˜λ„ν–ˆλ‹€λ©΄, 이 λͺ…령을 μ²˜λ¦¬ν•˜λŠ” λ°μ—λ§Œ 1~2초 정도 κ±Έλ¦¬λ―€λ‘œ 이 μ‹œκ°„λ™μ•ˆ 아무것도 λͺ»ν•˜κ²Œ λœλ‹€.

Get All Collections : 10만개λ₯Ό 맀번 λ‹€ κ°€μ Έμ˜¨λ‹€λ©΄? λ‹Ήμ—°νžˆ λŠλ €μ§„λ‹€.

그럼 KEYS λŠ” μ–΄λ–»κ²Œ λŒ€μ²΄ν•˜λŠ”κ²Œ μ’‹μ„κΉŒ?

KEYS λŒ€μ‹  scan λͺ…령을 μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ ν•˜λ‚˜μ˜ κΈ΄ λͺ…령을 짧은 μ—¬λŸ¬λ²ˆμ˜ λͺ…λ ΉμœΌλ‘œ λ°”κΏ€ 수 μžˆλ‹€. 이 짧은 λͺ…λ Ήλ“€ ν…€ 사이에 λ‹€λ₯Έ get / set 같은 λͺ…령듀을 또 μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€. 이 사이에 ꡉμž₯히 처리λ₯Ό 잘 μ‹œμΌœμ€€λ‹€.

같은 λ§₯락으둜, Collection 의 λͺ¨λ“  μ•„μ΄ν…œμ„ λ‹€ κ°€μ Έμ™€μ•Όν• λ•ŒλŠ” Collection 의 μΌλΆ€λ§Œ κ°€μ Έμ˜€κ±°λ‚˜ (Sorted Set), 큰 μ»¬λ ‰μ…˜μ„ λ‹€λ₯Έ μ—¬λŸ¬κ°œμ˜ μ»¬λ ‰μ…˜μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ μ €μž₯ν•œλ‹€. 1κ°œλ‹Ή λͺ‡ 천개 μˆ˜μ€€μœΌλ‘œ μ €μž₯ν•΄μ•Ό μ’‹λ‹€.

πŸ“š μ°Έκ³ 

μš°μ•„ν•œν…Œν¬μ„Έλ―Έλ‚˜(μš°μ•„ν•œλ ˆλ””μŠ€ by κ°•λŒ€λͺ…λ‹˜)

Redis 1

Redis 2

Redis 3



Summary



⁉️ λ©΄μ ‘ μ˜ˆμƒ 질문

  1. RedisλŠ” μ–΄λ–€ κ²½μš°μ— μ‚¬μš©ν• κΉŒμš”?
  1. Redis의 μž₯점은 무엇이 μžˆμ„κΉŒμš”?