DB

[Redis] Redis ์ด ์ •๋ฆฌ

REVI1337 2023. 12. 22. 20:36

๐Ÿ”ฅ Redis

Redis ๋Š” Remote Dictionary Server ์˜ ์•ฝ์ž์ด๋ฉฐ ๋‹ค์ˆ˜์˜ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„์ƒํ™˜๊ฒฝ์˜ ์„œ๋ฒ„๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” key: value ํ˜•ํƒœ์˜ HashTable ๊ตฌ์กฐ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.


๐Ÿ”ฅ Redis ์˜ ํŠน์ง•

  1. Redis ๋Š” C ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ Open Source In-Memory Data Store ์ด๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ In-Memory ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ์—… ๋ฐ์ดํ„ฐ์™€ Snapshot ์„ ์ œ์™ธํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ RAM(Random Access Memory) ์— ์ €์žฅ๋œ๋‹ค. ์ด ๋œป์€ ํœ˜๋ฐœ์„ฑ ๋ฐ์ดํ„ฐ์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ์˜ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค
  2. ํœ˜๋ฐœ์„ฑ ๋ฐ์ดํ„ฐ์ด์ง€๋งŒ RDB(Redis Database) + AOF(Append Only File) ๋ผ๋Š” ์˜ต์…˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†์ (Persistence) ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. Redis ๋Š” Single Thread ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์„ฑ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ๋‹ค์ค‘ ๋ชจ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ์ €์žฅํ•˜์—ฌ ์•ˆ์ •์„ฑ๊ณผ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ClusterMode ๋ฅผ ์ง€์›ํ•œ๋‹ค.
  5. Pub/Sub ๊ฐ™์€ ๊ธฐ์ˆ ์ด ์ž์ฒด์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋•Œ๋ฌธ์— ์ฑ„ํŒ…, ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ฅ Redis ์žฅ์ 

  1. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ RAM ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น ๋ฅธ Read/Write ์†๋„๋ฅผ ๋ณด์žฅํ•œ๋‹ค.
  2. ๋‹ค์–‘ํ•œ DataType ์„ ์ง€์› ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋‹ค์–‘ํ•œ ์–ธ์–ด์—์„œ Redis Client ๋ฅผ ์ง€์›ํ•œ๋‹ค.

๐Ÿ”ฅ Redis ์‚ฌ์šฉ ์‚ฌ๋ก€

  1. ์ž„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ (OTP), ์„ธ์…˜(Session) ๊ณผ ๊ฐ™์€ ์ž„์‹œ๋ฐ์ดํ„ฐ๋ฅผ Redis ์— Caching ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  2. ์„œ๋ฒ„์—์„œ ํŠน์ • API ์— ๋Œ€ํ•œ ์š”์ฒญ ํšŒ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด Redis ์˜ Rate Limiter ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. Redis ์˜ Lists ๋‚˜ Streams ๊ฐ™์€ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ํ™œ์šฉํ•˜์—ฌ Message Queue ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๊ฐ„์˜ Coupling ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  4. ์ˆœ์œ„ํ‘œ, ๋ฐ˜๊ฒฝ ํƒ์ƒ‰, ๋ฐฉ๋ฌธ์ž ์ˆ˜ ๊ณ„์‚ฐ ๊ณผ ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ๋ถ„์„ / ๊ณ„์‚ฐ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  5. Redis ์˜ Pub / Sub ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ”ฅ Redis ์˜ Persistence

๊ธฐ๋ณธ์ ์œผ๋กœ Redis ๋Š” ์บ์‹œ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ํœ˜๋ฐœ๋˜์–ด๋„ ๊ดœ์ฐฎ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋Ÿฐ ์บ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜์—ˆ์„๋•Œ ์„œ๋น„์Šค์˜ ๋ฌธ์ œ๋กœ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋”ฐ๋ผ Redis ๋Š” ์•ˆ์ •์ ์ธ Cache ์„œ๋ฒ„ ์šด์˜์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ Cache ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ €์žฅ(Persistence) ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

โœ” RDB

RDB ๋Š” Redis Database ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ํŠน์ • ์‹œ์ ์˜ Snapshot ์œผ๋กœ Cache ๋ฅผ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ฑฐ๋‚˜ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ Cache ๋ฅผ ๋ณต์ œํ• ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ Snapshot ์ด ์ƒ์„ฑ๋˜๊ธฐ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋  ์ˆ˜ ์žˆ๊ณ , Snapshot ์ƒ์„ฑ ์ค‘์— Client ์— ์š”์ฒญ Latency(์ง€์—ฐ) ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ” AOF

AOF ๋Š” Append Only File ์ด๋ผ๋Š” ์˜ต์…˜์œผ๋กœ Redis ์— ์ ์šฉ๋˜๋Š” ๋ชจ๋“  Write ์ž‘์—…์„ ๋กœ๊ทธ๋กœ ์ €์žฅํ•˜๋Š” ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์œ ์‹ค์—†์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ Sync ๋ฅผ ๋งž์ถœ ์ˆ˜ ์žˆ์ง€๋งŒ, ์žฌ๋‚œ ๋ณต๊ตฌ ์‹œ Write ์ž‘์—…์„ ๋‹ค์‹œ ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Snapshot ์„ ์ด์šฉํ•œ RDB ๋ฐฉ์‹๋ณด๋‹ค ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”ฅ Redis ์˜ Cache

Cache (์บ์‹œ) ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฝ๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์†๋„๊ฐ€ ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์บ์‹œ์— ์ €์žฅํ•ด ๋™์ผํ•œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ๋™์ผํ•œ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ , ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.


๋Œ€ํ‘œ์ ์œผ๋กœ CPU ์™€ RAM ์˜ ์†๋„ ์ฐจ์ด๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ L1, L2, L3 ์บ์‹œ, Web Browser ์บ์‹œ, AWS CloudFront ์˜ Edge Network ๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…์ธ CDN, ๋„๋ฉ”์ธ ์ฃผ์†Œ์™€ IP ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” DNS ์— ๋Œ€ํ•œ ์บ์‹œ์ธ DNS ์บ์‹œ, ๊ทธ๋ฆฌ๊ณ  JPA ์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ 1์ฐจ ์บ์‹œ๊ฐ€ ์žˆ๋‹ค.

โœ” Cache Hit & Cache Miss

Redis ์„œ๋ฒ„์— ์ €์žฅ๋œ ํŠน์ • Key ๊ฐ’์„ ๊ฐ–๋Š” Cache ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต์ด ์˜จ๊ฒƒ์„ Cache Hit ๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋ฉฐ Key ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ Key ๊ฐ’์ด ๋งŒ๋ฃŒ๋˜์–ด ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต์ด ์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์„ Cache Miss ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

โœ” Cache Aside Pattern

Cache Aside Pattern ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Client ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ๋•Œ ๋จผ์ € Redis ์„œ๋ฒ„์—์„œ Cache ๋ฅผ ์กฐํšŒํ•œ ๋‹ค์Œ Cache Hit ๋ฉด Cache ๊ฐ’์„ ์‘๋‹ตํ•ด์ฃผ๊ณ  Cache Miss ๋ฉด DB ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ฐ˜ํ™˜ ํ›„, Redis ์„œ๋ฒ„์— Write Cache ๋ฅผ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.


Cache Hit ์ผ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘.


Cache Miss ์ผ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘.

Cache ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด ์ค‘, ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ํŒจํ„ด์ด๋ฉฐ Write Through, Write Behind ๊ฐ™์€ ํŒจํ„ด๋„ ์žˆ์ง€๋งŒ ์ž์ฃผ ์‚ฌ์šฉ๋œ ์•Š๋Š”๋‹ค.


๐Ÿ”ฅ Redis ์„ค์น˜ ๋ฐ ์‹คํ–‰

Parrot OS(Debian) ๊ธฐ์ค€ ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Docker ๋ฅผ ๋ฐ›์€ ํ›„, Docker ํ™˜๊ฒฝ์—์„œ Redis ๋ฅผ ์„ค์น˜ํ•˜์—ฌ Redis ํ”„๋กฌํ”„ํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.

$ sudo apt update
$ sudo apt-get install docker.io -y
$ docker pull redis
$ docker run --name redis redis &
$ docker exec -it redis redis-cli

โœ” Redis ๋™์ž‘ ํ™•์ธ

ping ์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ PONG ์ด ์˜ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ.

set ์œผ๋กœ ํŠน์ • key ์— ๋Œ€ํ•œ value ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, get ์œผ๋กœ ํŠน์ • key ์— ๋Œ€ํ•œ value ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๋ช…๋ น์–ด๋“ค์„ Ignore Case ์ด๋‹ค.

ํŠน์ • key ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ del ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค. 1 ์„ ๋ฆฌํ„ดํ•˜๋ฉด ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋˜์ด์ œ ์‚ญ์ œํ•œ key ๋ฅผ get ํ•ด๋ณด๋ฉด nil ์ด ๋‚˜์˜ค๋Š”๋ฐ redis ์—์„œ nil ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.


๐Ÿ”ฅ Redis ์˜ DataType

โœ” Strings

๋ฌธ์ž์—ด, ์ˆซ์ž, ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด(JSON String) ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Syntax Description
set KEY VALUE ๋‹จ์ผ Key ์— ๋Œ€ํ•œ String Value ๊ฐ’์„ ์„ค์ •
mset KEY VALUE KEY VALUE ... multi set ์˜ ์•ฝ์ž๋กœ ๋‹ค์ˆ˜๊ฐœ์˜ Key ์— ๋Œ€ํ•œ String Value ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
get KEY ๋‹จ์ผ Key ์— ๋Œ€ํ•œ String Value ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค
mget KEY KEY KEY ... multi get ์˜ ์•ฝ์ž๋กœ ๋‹ค์ˆ˜๊ฐœ์˜ Key ์— ๋Œ€ํ•œ String Value ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
incr price price ๋ผ๋Š” key ์˜ ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค
incrby price NUM price ๋ผ๋Š” key ์˜ ๊ฐ’์„ NUM ๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค
set jsonstring '{"key": 100, "value": "test"}' jsonstring ์ด๋ผ๋Š” key ๊ฐ’์— json string ์„ ์ €์žฅ. ์‚ฌ์šฉํ• ๋•Œ๋Š” json ์œผ๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
set name:name:name revi1337 name:name:name ์ด๋ผ๋Š” ํ‚ค ๊ฐ’์€ revi1337 ์ด๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

โœ” Lists

String ์„ LinkedList ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์ด๋‹ค. ์ด์ค‘์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋ฉฐ push/pop ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ์–ด, Queue ๋‚˜ Stack ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Syntax Description
lpush NAME VALUE VALUE VALUE ... NAME ์ด๋ผ๋Š” ์ด์ค‘์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ์™ผ์ชฝ๋ถ€ํ„ฐ VALUE ๋“ค์„ ์‚ฝ์ž…ํ•œ๋‹ค.
rpop NAME Queue (FIFO) NAME ์ด๋ผ๋Š” ์ด์ค‘์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค.
lpop NAME Stack (LIFO) NAME ์ด๋ผ๋Š” ์ด์ค‘์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ์™ผ์ชฝ ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค.
lrange NAME -2 -1 Index ๋ฅผ ์ด์šฉํ•ด ๋‹ค์ˆ˜๊ฐœ์˜ ๊ฐ’์„ ์ถœ๋ ฅ. ์˜ค๋ฅธ์ชฝ์—์„œ ์„ธ๋ฉด 0 ๋ถ€ํ„ฐ ์ฆ๊ฐ€ํ•˜๋ฉฐ ์™ผ์ชฝ์—์„œ ์„ธ๋ฉด -1 ๋ถ€ํ„ฐ ์ ์ฐจ ๊ฐ์†Œํ•œ๋‹ค.
ltrim NAME 0 0 ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ item ๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ์‚ญ์ œํ•œ๋‹ค.

List ์˜ ๋ชจ๋“  ๊ฐ’ ์ถœ๋ ฅ์€ lrange NAME 0 -1 ์ด ๋œ๋‹ค.

โœ” Sets

Uniq String ์„ ์ €์žฅํ•˜๋Š” ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ง‘ํ•ฉ. Set Operation ์‚ฌ์šฉ๊ฐ€๋Šฅ (intersection, union, difference)

Syntax Description
sadd NAME VALUE VALUE VALUE NAME ์ด๋ผ๋Š” Set ์— VALUE ๋ฐ์ดํ„ฐ๋“ค์„ ์ถ”๊ฐ€ (์ค‘๋ณต X)
smembers NAME NAME ์ด๋ผ๋Š” Set ๋ฉค๋ฒ„๋“ค์„ ๋ชจ๋‘ ์ถœ๋ ฅ
scard NAME NAME ๋ผ๋Š” Set ๋ฉค๋ฒ„๋“ค์ค‘์—์„œ Uniq ํ•œ ๋ฉค๋ฒ„๋“ค์˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ
sinter NAME1 NAME2 NAME1 ๋ผ๋Š” Set ์™€ NAME2 Set ์˜ ๊ต์ง‘ํ•ฉ ๋ฉค๋ฒ„ ์ถœ๋ ฅ
sdiff NAME1 NAME2 NAME1 ๋ผ๋Š” Set ์™€ NAME2 Set ์˜ ์ฐจ์ง‘ํ•ฉ ๋ฉค๋ฒ„ ์ถœ๋ ฅ
sunion NAME1 NAME2 NAME1 ๋ผ๋Š” Set ์™€ NAME2 Set ์— ํ•ฉ์ง‘ํ•ฉ ๋ฉค๋ฒ„ ์ถœ๋ ฅ
sismember NAME VALUE NAME ๋ผ๋Š” Set ์— VALUE ๋ผ๋Š” ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ํ™•์ธ

โœ” Hashs

Field-Value ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ฉฐ, ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ๊ฐ–๋Š” ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. Dictionary ์™€ Map ์„ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

Syntax Description
hset NAME KEY VALUE KEY VALUE ... ๋‹ค์ˆ˜์˜ KEY:VALUE ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ NAME ์ด๋ผ๋Š” hash ์— ์‚ฝ์ž…
hmget NAME KEY KEY KEY NAME ์ด๋ผ๋Š” hash ์—์„œ ๋‹ค์ˆ˜๊ฐœ์˜ KEY ์•  ๋Œ€ํ•œ VALUE ๋“ค์„ ์ถœ๋ ฅ
hincrby NAME KEY NUM NAME ์ด๋ผ๋Š” hash ์—์„œ KEY ์˜ VALUE ๋ฅผ ๊บผ๋‚ด NUM ๋งŒํผ ์ˆ˜๋ฅผ increase ํ•œ๋‹ค
hget NAME KEY NAME ์ด๋ผ๋Š” hash ์—์„œ ๋‹จ์ผ๊ฐœ์˜ KEY ์— ๋Œ€ํ•œ VALUE ๋ฅผ ์ถœ๋ ฅ
hgetall NAME NAME ์ด๋ผ๋Š” hash ์—์„œ KEY VALUE ๋“ค์„ ๋ชจ๋‘ ์ถœ๋ ฅ.

โœ” Sorted Sets

Uniq String ์„ ์ €์žฅํ•˜๋Š” ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ง‘ํ•ฉ์ธ Set ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ score ๋ผ๋Š” ์ถ”๊ฐ€์ ์ธ ํ•„๋“œ๋ฅผ ๊ฐ–์Œ์œผ๋กœ์„œ ํ•ด๋‹น score ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •๋ ฌํ•˜๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์ด๋‹ค. ZSets ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ์šฐ๋ฉฐ Redis ๋งŒ์˜ ๋…ํŠนํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€์ ์œผ๋กœ Skip List + Hash Table ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ˆœ๊ฐ„ score ์— ์˜ํ•ด ๊ฐ’์˜ ์ •๋ ฌ์„ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ score ๊ฐ€ ๋™์ผํ•˜๋ฉด ์‚ฌ์ „ ํŽธ์ฐฌ ์ˆœ ์œผ๋กœ ์ •๋ ฌํ•˜๊ฒŒ ๋œ๋‹ค.

Syntax Description
zadd NAME SCORE VALUE SCORE VALUE ... NAME ์ด๋ผ๋Š” ZSets ์— VALUE ๋“ค์„ ์ €์žฅํ•œ๋‹ค. ์ด๋•Œ SCORE ์ˆœ์œผ๋กœ ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.
zrange NAME IDX IDX NAME ์ด๋ผ๋Š” ZSets ์—์„œ ์‹œ์ž‘ IDX ๋ถ€ํ„ฐ ๋ IDX ์˜ VALUE ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์™ผ์ชฝ๋ถ€ํ„ฐ 0์—์„œ ์ฆ๊ฐ€ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ -1 ์—์„œ ์ž‘์•„์ง„๋‹ค.
zrange NAME IDX IDX REV zrange NAME IDX IDX ์˜ ์—ญ์ˆœ.
zrange NAME IDX IDX REV WITHSCORES zrange NAME IDX IDX REV ์— SCORE ๋„ ๊ฐ™์ด ๋ฐ˜ํ™˜.
zrank NAME VALUE NAME ์ด๋ผ๋Š” ZSets ์—์„œ VALUE ์˜ ๋žญํฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์ธ๋ฑ์Šค ๊ฐ’๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น VLAUE ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค ๋ณด๋ฉด ๋œ๋‹ค.

โœ” Streams

append-only log ์— consumer groups ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์—ฌ๊ธฐ์„œ append-only log ๋Š” db ๋‚˜ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜์ •๊ณผ ์‚ญ์ œ๋Š” ๋˜์ง€์•Š๊ณ  ์ถ”๊ฐ€๋งŒ ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.


xadd ์ŠคํŠธ๋ฆผ ๋ฅผ ํ†ตํ•ด Stream ์— ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ  * ๋ฅผ ํ†ตํ•ด Uniq ์•„์ด๋””๋ฅผ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. * ์ดํ›„์—๋Š” Hash ์™€ ๊ฐ™์€ Field Value ํ˜•ํƒœ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” xadd ๋ฅผ ํ†ตํ•ด test-events ๋ผ๋Š” Stream ์„ ์— * ๋ฅผ ํ†ตํ•ด Uniq ์•„์ด๋””๋ฅผ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•˜๋ฉฐ, test-events ๋ผ๋Š” Stream ์— action ์€ like, user_id ๊ฐ€ 1, product_id ๊ฐ€ 1 ์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ณ  ์ถœ๋ ฅ๋œ ์ˆซ์ž๋“ค์€ ์‹๋ณ„์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค. - ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž์ด ์ถ”๊ฐ€๋œ ์‹œ๊ฐ„, ๋’ค์—๋Š” 0 ๋ฒˆ์งธ item ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์‹œ๊ฐ„์— ์ถ”๊ฐ€๋œ 0๋ฒˆ์งธ item ์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

xrange ์ŠคํŠธ๋ฆผ - + ๋ฅผ ํ†ตํ•ด ํŠน์ • Stream ์—์„œ ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ๋“ค์–ด๊ฐ„ ์ด๋ฒคํŠธ๋ถ€ํ„ฐ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ์ด๋ฒคํŠธ์ˆœ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

xdel ์ŠคํŠธ๋ฆผ ์‹๋ณ„์ž ์„ ํ†ตํ•ด ์‚ฌ์šฉํ•œ ์ด๋ฒคํŠธ ๋ฐ ์•„์ดํ…œ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ” Geospatial

์ขŒํ‘œ๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐํƒ€์ž…์ด๋‹ค. ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ, ๋ฒ”์œ„ ํƒ์ƒ‰ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. LONGITUDE ๋Š” ๊ฒฝ๋„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ LATITUDE ๋Š” ์œ„๋„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Syntax Description
geoadd NAME LONGITUDE LATITUDE MEMBER [LONGITUDE LATITUDE MEMBER ...] NAME ์— LONGITUDE LATITUDE ์˜ ์ขŒํ‘œ๋ฅผ ๊ฐ–๋Š” MEMBER ๋“ค์„ ์ €์žฅ
geodist NAME MEMBER1 MEMBER2 [M|KM|FT|MI] NAME ์˜ MEMBER1 ์™€ MEMBERR2 ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
georadius NAME LONGITUDE LATITUDE DISTANCE M|KM|FT|MI LONGITUDE LATITUDE ๋ฅผ ๊ธฐ์ค€์œผ๋กœ DISTANCE (๋‹จ์œ„) ๋ฐ˜๊ฒฝ ์ด๋‚ด์— ์žˆ๋Š” NAME ์˜ ํŠน์ • MEMBER ๋“ค์„ ์ถœ๋ ฅ (๋‹จ์œ„๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•จ)

geoadd ๋ฅผ ํ†ตํ•ด seoul:station ์— ์šฐ์žฅ์‚ฐ์—ญ๊ณผ ๋ฐœ์‚ฐ์—ญ์„ ๊ฒฝ๋„ ์œ„๋„๋ฅผ ์ €์žฅ.

geodist ๋ฅผ ํ†ตํ•ด ์šฐ์žฅ์‚ฐ์—ญ๊ณผ ๋ฐœ์‚ฐ์—ญ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด ๋•Œ ๋‹จ์œ„๋Š” ์„ ํƒ์‚ฌํ•ญ์ด๋‹ค.

๋˜ํ•œ ์•„๋ž˜์™€ ๊ฐ™์ด seoul:subway ๋ผ๋Š” key ๊ฐ’์œผ๋กœ ์šฐ์žฅ์‚ฐ, ๋ฐœ์‚ฐ, ํ™”๊ณก, ๊นŒ์น˜์‚ฐ, ๋งˆ๊ณก ์ด๋ผ๋Š” MEMBER ๋“ค์˜ ๊ฒฝ๋„/์œ„๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์ฃผ๊ณ 

georadius ๋กœ ๊ฒฝ๋„/์œ„๋„ ๋ฅผ ๊ธฐ์ค€์œผ๋กœ DISTANCE (๋‹จ์œ„) ์ด๋‚ด์— ์žˆ๋Š” NAME ์˜ MEMBER ๋“ค๋„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์‹œ๋Š” ํŠน์ • ๊ฒฝ๋„/์œ„๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ 2 KM ๋ฐ˜๊ฒฝ์— ์žˆ๋Š” seoul:subway ์˜ MEMBER ๋“ค์„ ์ถœ๋ ฅํ•œ ๊ฒƒ์ด๋‹ค.

โœ” Bitmaps

์‹ค์ œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์•„๋‹ˆ๊ณ , String ์— Binary Operation ์„ ์ ์šฉํ•œ ๊ฒƒ. ์ตœ๋Œ€ 42์–ต๊ฐœ์˜ Binary ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งค์šฐ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


Bitmaps ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋‚ ์งœ์— ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์‚ฌ์ง„์€ ํŠน์ •๋‚ ์งœ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•œ๊ฒƒ์ด๋‹ค. 123, 456 ์€ ์‚ฌ์šฉ์ž์•„์ด๋””๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, 1 ์€ ์ ‘์†ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

bitcount ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋‚ ์งœ์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ˆ˜ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

bitop ๋ฅผ ํ†ตํ•ด ๋ช…์‹œํ•œ ๋‚ ์งœ๋“ค์— ๋ชจ๋‘ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋“ค์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘๊ฐœ์˜ ๋‚ ์งœ์— ๋ชจ๋‘ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋‹ˆ AND ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ result ๋ผ๋Š” ์ƒˆ๋กœ์šด bitmap ์„ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•œ๋‹ค. (๊ธฐ๋ณธ์ ์œผ๋กœ bitop ์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ์ƒˆ๋กœ์šด bitmap ์„ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•œ๋‹ค. ๋˜ํ•œ, operation ์—๋Š” OR, AND, XOR ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.)

์•ž์„œ bitop ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋‚ ์งœ๋“ค์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋“ค์˜ ์ˆ˜๋ฅผ result ๋น„ํŠธ๋งต์— ์ €์žฅํ–ˆ๋‹ค. ์ด๋Š” bitcount ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด 1๋ช…์ด ๋‚˜์˜จ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, getbit ๋ฅผ ํ†ตํ•ด result ๋น„ํŠธ๋งต์— ์ €์žฅ๋œ ์‚ฌ์šฉ์ž๋“ค์ด ๋กœ๊ทธ์ธํ–ˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ” HyperLogLog

์ง‘ํ•ฉ์˜ Cardinality ๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ™•๋ฅ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ •ํ™•์„ฑ์„ ์ผ๋ถ€ ํฌ๊ธฐํ•˜๋Š” ๋Œ€์‹  ์ €์žฅ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค (ํ‰๊ท  ์—๋Ÿฌ 0.81%) . HyperLogLog ๋Š” ์‹ค์ œ ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  item ์„ ๋‹ค์‹œ ์ถœ๋ ฅํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค


ํ„ฐ๋ฏธ๋„์—์„œ set ์— 1000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ์ปค๋งจ๋“œ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋Œ๋ ค์ฃผ๊ณ 

$ for((i=0; i<=1000; i++)); do docker exec -it redis redis-cli sadd set-card $i; done &

์ด์–ด์„œ ๋ฐ”๋กœ pfadd ๋ฅผ ํ†ตํ•ด HyperLogLog ์— 1000 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ์ปค๋งจ๋“œ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋Œ๋ ค์ฃผ๊ณ  ์ด ์ž‘์—…๋“ค์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ๋‚œ ๋„์ปคํ™˜๊ฒฝ์ด๋ผ ์ด๊ฑฐ ์ƒ๋‹นํžˆ ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค. ใ…‹ใ…‹;;

$ for((i=0; i<=1000; i++)); do docker exec -it redis redis-cli pfadd hyber-card $i; done &

์ด์ œ pfcount ๋กœ HyperLogLog ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด 1002 ๊ฐ€ ๋‚˜์˜จ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 0.81 ํผ์„ธํŠธ ์—๋Ÿฌ๊ฐ€ ๋‘๋ฒˆ ํ„ฐ์ง„๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด๋ฉด Set ๋ณด๋‹ค HyperLogLog ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์ด ๋ช‡์‹ญ๋ฐฐ ์ฐจ์ด๋‚˜๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โœ” BloomFilter

element ๊ฐ€ ์ง‘ํ•ฉ ์•ˆ์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ™•๋ฅ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ๋ฉค๋ฒ„์‰ฝ ํ…Œ์ŠคํŠธ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค. BloomFilter ๋„ HyperLogLog ์ฒ˜๋Ÿผ ์ •ํ™•์„ฑ์„ ์ผ๋ถ€ ํฌ๊ธฐํ•˜๋Š” ๋Œ€์‹  ์ €์žฅ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ์‹ค์ œ ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ’์ด ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ •ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๊ณ  ์ž˜๋ชปํ•˜๋Š” false positive ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. bf.madd ๋ฅผ ํ†ตํ•ด ์ง‘ํ•ฉ์— item ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ bf.exists ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น item ์ด ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

BloomFilter ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠน์ •ํ•œ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋„์ปค๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

$ docker run -p 63790:6379 -d --rm redis/redis-stack-server

์ด์ œ BloomFilter ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” redis ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

์ด์ œ bf.add ์™€ bf.madd ๋ฅผ ํ†ตํ•ด ์ง‘ํ•ฉ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, bf.exists ๋กœ ํŠน์ • item ์ด ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ์€ ์ง‘ํ•ฉ๋‚ด๋ถ€์˜ item ๊ฐœ์ˆ˜๊ฐ€ ์ ์–ด์„œ ์—†๋Š” ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ‘œํ˜„๋˜๋Š” false positivie ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ์ง‘ํ•ฉ ๋‚ด๋ถ€ item ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด false positive ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์—ผ๋‘ํ•˜๊ณ , ๋Œ€์ฒ˜๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค.


๐Ÿ”ฅ Redis ์˜ ํŠน์ˆ˜ ๋ช…๋ น์–ด

โœ” Expiration

๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ์‹œ๊ฐ„ ์ดํ›„์— ๋งŒ๋ฃŒ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ. ๋ณดํ†ต TTL(Time To Live) ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ ์‹œ๊ฐ„(์ดˆ) ๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค. set ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  expire ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ttl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚จ์€ TTL ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ setex ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•จ๊ณผ ๋™์‹œ์— ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ๋™์‹œ์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

set ์œผ๋กœ greeting ์— hello ๋ฅผ ์ €์žฅํ•˜๊ณ  ttl ์„ ํ†ตํ•ด ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ํ™•์ธํ•ด๋ณธ๋‹ค ์—ฌ๊ธฐ์„œ -1 ์€ ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์„ค์ •๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ด์ œ expire ๋กœ greeting ์— 10 ์ดˆ์˜ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•ด์ค€๋‹ค. ์ด์ œ ์ฃผ๊ธฐ์ ์œผ๋กœ ttl ๋กœ greeting ์„ ํ™•์ธํ•ด๋ณด๋ฉด ์ˆซ์ž๊ฐ€ ์ค„์–ด๋“ค๋‹ค๊ฐ€ -2 ๊ฐ€ ์ถœ๋ ฅ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

-2 ๋Š” ํ•ด๋‹น ๊ฐ’์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ๋•Œ๋ฌธ์— get ์œผ๋กœ greeting ์„ ์ฐพ๊ฒŒ๋˜๋ฉด ๊ฐ’์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ธ nil ์ด ์ถœ๋ ฅ๋˜๋Š”๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ setex ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ, ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ค์ •์„ ํ•œ๋ฒˆ์— ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

โœ” SET NX/XX

NX ๋Š” ํ•ด๋‹น Key ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜ต์…˜์ด๋‹ค. ์ด์™€ ๋ฐ˜๋Œ€๋กœ XX ๋Š” ํ•ด๋‹น Key ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ์˜ต์…˜์ด๋‹ค. NX ์˜ต์…˜๊ณผ XX ์˜ต์…˜์€ set ์˜ ๋งจ ๋’ค์— ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋˜๋ฉฐ, set ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด nil ์„ ์‘๋‹ตํ•˜๊ฒŒ ๋œ๋‹ค.


NX ํ…Œ์ŠคํŠธ


greeting ์— ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๊ณ  ๊ฐ’์„ ํ™•์ธํ•ด์ค€๋‹ค.

์ด์ œ NX ๋ฅผ ์‚ฌ์šฉํ•ด์„œ greeting ๊ฐ’์„ Overwite ํ•ด๋ณด๋ฉด ์ด๋ฏธ greeting ์— ๊ฐ’์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— set ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์•„ nil ์„ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

XX ํ…Œ์ŠคํŠธ


์ด๋ฒˆ์—๋Š” XX ์˜ต์…˜์„ ํ†ตํ•ด greeting2 ๊ฐ’์„ ์„ค์ •ํ•ด๋ณด๋ฉด nil ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” greeting2 ๋ผ๋Š” ๊ฐ’์ด ์›๋ž˜๋ถ€ํ„ฐ ์—†์—ˆ๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.

โœ” Pub/Sub

Publisher / Subscriber ๋ผ๋Š” ๋œป์œผ๋กœ ์‹œ์Šคํ…œ ์‚ฌ์ด์˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ต์‹ ํ•˜๋Š” ํŒจํ„ด์ค‘ ํ•˜๋‚˜์ด๋ฉฐ pub ๊ณผ sub ์ด ์„œ๋กœ ์•Œ์ง€ ๋ชปํ•ด๋„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก decoupling ๋˜์–ด ์žˆ๋Š” ํŒจํ„ด์ด๋‹ค. publisher ๋Š” subscriber ์—๊ฒŒ ์ง์ ‘ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ , Channel ์— ๋ฉ”์‹œ์ง€๋ฅผ publish ํ•˜๊ฒŒ ๋œ๋‹ค. subscriber ๋Š” ๊ด€์‹ฌ์ด ์žˆ๋Š” Channel ๋งŒ Subscribe ํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ subscriber ์˜ ๊ธฐ๋Šฅ์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ publisher ๋Š” ์ด๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Redis Stream ๊ณผ ๋‹ค๋ฅธ์ ์€ ๋ฐœ์ƒ๋œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด๊ด€๋˜๋Š” Stream ๊ณผ ๋‹ฌ๋ฆฌ Pub/Sub ์€ ์ด๋ฏธ ๋ฐœ์ƒ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ์ˆ˜์‹ ํ•  ์ˆ˜ ์—†๋‹ค.


subscribe ๋ช…๋ น์–ด๋กœ ํŠน์ •ํ•œ Channel ์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, publish ๋ช…๋ น์–ด๋กœ ์›ํ•˜๋Š” Channel ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

Syntax Description
subscribe CHANNEL [CHANNEL ...] CHANNL ์„ ๊ตฌ๋…
publish CHANNEL MESSAGE CHANNEL ์— MESSAGE ๋ฅผ ํผ๋ธ”๋ฆฌ์‹œ (์ „์†ก)

์•„๋ž˜์™€ ๊ฐ™์ด subscribe ๋กœ ํŠน์ •ํ•œ ch:order ์™€ ch:payment ๋ผ๋Š” ์ฑ„๋„์„ ๊ตฌ๋…ํ•ด์ฃผ๊ณ 

๋˜ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ publish ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ํผ๋ธ”๋ฆฌ์‹œํ•ด์ฃผ๋ฉด

์›๋ž˜์˜ ํ„ฐ๋ฏธ๋„์—์„œ message ๋ผ๋Š” ํƒ€์ž…์ด publish ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ch:order ๋ผ๋Š” ์ฑ„๋„๋กœ๋ถ€ํ„ฐ new-order ๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, publisher ์ชฝ์—์„œ ์กด์žฌํ•˜์ง€ ์•Š๋Š” Channel ์— ๋Œ€ํ•ด ๋ฉ”์‹œ์ง€๋ฅผ publish ํ•˜๋ คํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (integer) 0

โœ” Transaction

๋‹ค์ˆ˜์˜ ๋ช…๋ น์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ. ๊ธฐ๋ณธ์ ์œผ๋กœ ์›์ž์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์— ์†ํ•œ ๋‹ค์ˆ˜์˜ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€ ์˜ค๋ฅ˜ ํ˜น์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ชจ๋“  ์ž‘์—…์„ Rollback ํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ Client ์˜ ์š”์ฒญ์ด ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค ์ˆ˜ ์—†๋‹ค.

์›์ž์„ฑ(Atomic) ์ด๋ž€ ๋ชจ๋“  ์ž‘์—…์ด ์ ์šฉ๋˜๊ฑฐ๋‚˜ ํ•˜๋‚˜๋„ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํŠน์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

multi ๋ช…๋ น์–ด๋กœ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ํ›„ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•  ๋ช…๋ น๋“ค์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” discard ๋กœ ๋กค๋ฐฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , exec ๋กœ ์ปค๋ฐ‹์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


์•„๋ž˜ ์‚ฌ์ง„์—์„œ์ฒ˜๋Ÿผ multi ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ด์ฃผ๋ฉด ํ”„๋กฌํ”„ํŠธ์— TX ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉฐ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ํŠน์ •ํ•œ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด QUEUED ๋ผ๋Š” ๊ฒƒ์ด ์ถœ๋ ฅ๋œ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ foo ๋ผ๋Š” key ์— 1์„ ์ฆ๊ฐ€์‹œํ‚ค๋ผ๋Š” ์ž‘์—…์ด ํ์— ๋“ค์–ด๊ฐ”๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ž‘์—…์ด ํ์— ๋“ค์–ด๊ฐ”์„ ๋ฟ ์•„์ง์€ ์•„์ง์€ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— discard ๋ฅผ ํ†ตํ•ด ๋กค๋ฐฑ์‹œ์ผœ ์ฃผ๊ณ  foo ๋ฅผ ํ™•์ธํ•ด์ฃผ๋ฉด ์–ด๋– ํ•œ ๊ฐ’์ด ์ €์žฅ๋˜์ง€ ์•Š์€๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, discard ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ , exec ๋ฅผ ํ†ตํ•ด ์ปค๋ฐ‹์„ ํ•ด์ฃผ๋ฉด ํ์— ๋“ค์–ด๊ฐ€์žˆ๋˜ ์ž‘์—…๋“ค์ด ์ˆ˜ํ–‰๋˜์–ด foo ์— ๊ฐ’์ด ์ €์žฅ๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”ฅ Redis ์ฃผ์˜ํ•  ์ 

โœ” O(N) ๋ช…๋ น์–ด

Redis ์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ช…๋ น์–ด๋“ค์€ O(1) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๋ช…๋ น์–ด๋“ค์€ O(N) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋˜ํ•œ Redis ๋Š” Single Thread ๋กœ ๋ช…๋ น์–ด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” O(N) ๋ช…๋ น์–ด ์‹œ, ์ „์ฒด์ ์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.


๋Œ€ํ‘œ์ ์œผ๋กœ O(N) ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ๋ช…๋ น๋“ค์€ keys ์ด๋‹ค. keys * ๋ฅผ ์“ฐ๊ฒŒ ๋˜๋ฉด ๋ชจ๋“  Redis ์— ์ €์žฅ๋œ ๋ชจ๋“  key ๋“ค์„ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜์—์„œ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ํŠน์ • ํŒจํ„ด์— ๋งž๋Š” key ๋ฅผ ์กฐํšŒํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ scan ๋ช…๋ น์–ด๋กœ ๋Œ€์ฒดํ•˜๋„๋ก ํ•˜์ž. ์ด๋Š” del ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ del ์€ unlink ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.


๋˜ํ•œ, set ์˜ ๋ชจ๋“  MEMBER ๋“ค์„ ์ถœ๋ ฅํ•˜๋Š” smembers ๋„ O(N) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. set ๋‚ด๋ถ€ MEMBER ์˜ ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ํ•˜๋‚˜์˜ set ์— ๋งŒ๊ฐœ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š”๊ฒƒ๋ณด๋‹ค set ์„ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒƒ์ด ๋‚ซ๋‹ค.


๋งˆ์ง€๋ง‰์œผ๋กœ hash ์˜ ๋ชจ๋“  field ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” hgetall ๋„ O(N) ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์‹ฌํ•ด์•ผํ•œ๋‹ค.


๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. keys * ๋ฅผ scan ์œผ๋กœ ๋Œ€์ฒด
  2. hgetall ์„ hscan ์œผ๋กœ ๋Œ€์ฒด
  3. del ์„ unlink ๋กœ ๋Œ€์ฒด

โœ” Thundering Herd Problem

๋ณ‘๋ ฌ ์š”์ฒญ์ด ๊ณต์œ  ์ž์›์— ๋Œ€ํ•ด์„œ ์ ‘๊ทผํ•  ๋•Œ, ๊ธ‰๊ฒฉํ•œ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. Cache ๋งŒ๋ฃŒ์— ์˜ํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ Process ์—์„œ Cronjob ์„ ํ†ตํ•ด Cache ๋ฅผ ์ตœ์‹ ํ™”์‹œ์ผœ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

โœ” Stale Cache Invalidation

Cache ์˜ ์œ ํšจ์„ฑ์ด ์†์‹ค๋˜์—ˆ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ, ์บ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•œ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ Cache ๋ฅผ ๊ณ„์† ๊ฐ–๊ณ ์žˆ์„๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ”ฅ ์ฐธ๊ณ 

ํ•ด๋‹น ๊ธ€์€ ์ธํ”„๋Ÿฐ ์‹ ๋™ํ˜„ ๊ฐ•์‚ฌ๋‹˜์˜ ์‹ค์ „! Redis ํ™œ์šฉ ๊ฐ•์˜๋ฅผ ๋ณด๋ฉฐ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.