[Redis] Redis ์ด ์ ๋ฆฌ
๐ฅ Redis
Redis ๋ Remote Dictionary Server ์ ์ฝ์์ด๋ฉฐ ๋ค์์ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๋ถ์ํ๊ฒฝ์ ์๋ฒ๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ์ ์๋ key: value ํํ์ HashTable ๊ตฌ์กฐ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
๐ฅ Redis ์ ํน์ง
- Redis ๋ C ์ธ์ด๋ก ์์ฑ๋ Open Source In-Memory Data Store ์ด๋ค. ๋ง ๊ทธ๋๋ก In-Memory ์ด๊ธฐ ๋๋ฌธ์ ๋ฐฑ์
๋ฐ์ดํฐ์ Snapshot ์ ์ ์ธํ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋
RAM
(Random Access Memory) ์ ์ ์ฅ๋๋ค. ์ด ๋ป์ ํ๋ฐ์ฑ ๋ฐ์ดํฐ์ด์ง๋ง ๋ฐ์ดํฐ์ ์ ๊ทผ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค - ํ๋ฐ์ฑ ๋ฐ์ดํฐ์ด์ง๋ง
RDB
(Redis Database) +AOF
(Append Only File) ๋ผ๋ ์ต์ ์ ํตํด ๋ฐ์ดํฐ๋ฅผ์์์
(Persistence) ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค. - Redis ๋
Single Thread
๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ ์ ์๋ ๋์์ฑ๋ฌธ์ ๋ฅผ ์กฐ๊ธ์ด๋๋ง ํด๊ฒฐํ ์ ์๋ค. - ๋ค์ค ๋ชจ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ์ ์ฅํ์ฌ ์์ ์ฑ๊ณผ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ ์ ์๋
ClusterMode
๋ฅผ ์ง์ํ๋ค. Pub/Sub
๊ฐ์ ๊ธฐ์ ์ด ์์ฒด์ ์ผ๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ฌธ์ ์ฑํ , ์๋ฆผ๊ณผ ๊ฐ์ ์ค์๊ฐ ํต์ ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด๋ค ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋ค.
๐ฅ Redis ์ฅ์
- ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ RAM ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์
๋งค์ฐ ๋น ๋ฅธ Read/Write ์๋
๋ฅผ ๋ณด์ฅํ๋ค. ๋ค์ํ DataType ์ ์ง์
ํ๊ธฐ ๋๋ฌธ์ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.- ๋ค์ํ ์ธ์ด์์ Redis Client ๋ฅผ ์ง์ํ๋ค.
๐ฅ Redis ์ฌ์ฉ ์ฌ๋ก
- ์์ ๋น๋ฐ๋ฒํธ (OTP), ์ธ์
(Session) ๊ณผ ๊ฐ์ ์์๋ฐ์ดํฐ๋ฅผ Redis ์
Caching
ํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. - ์๋ฒ์์ ํน์ API ์ ๋ํ ์์ฒญ ํ์๋ฅผ ์ ํํ๊ธฐ ์ํด Redis ์
Rate Limiter
๋ฅผ ์ฌ์ฉํ ์ ์๋ค. - Redis ์ Lists ๋ Streams ๊ฐ์ ๋ฐ์ดํฐํ์
์ ํ์ฉํ์ฌ
Message Queue
๋ฅผ ๊ตฌํํ์ฌ ๋ค์ํ ์๋น์ค๊ฐ์ Coupling ์ ์ค์ผ ์ ์๋ค. - ์์ํ, ๋ฐ๊ฒฝ ํ์, ๋ฐฉ๋ฌธ์ ์ ๊ณ์ฐ ๊ณผ ๊ฐ์
์ค์๊ฐ ๋ถ์ / ๊ณ์ฐ
์ด ๊ฐ๋ฅํ๋ค. - 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) ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ผํ๋ค.
๋์ฒดํ ์ ์๋ ์ปค๋งจ๋๋ฅผ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
keys *
๋ฅผscan
์ผ๋ก ๋์ฒดhgetall
์hscan
์ผ๋ก ๋์ฒดdel
์unlink
๋ก ๋์ฒด
โ Thundering Herd Problem
๋ณ๋ ฌ ์์ฒญ์ด ๊ณต์ ์์์ ๋ํด์ ์ ๊ทผํ ๋, ๊ธ๊ฒฉํ ๊ณผ๋ถํ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค. Cache ๋ง๋ฃ์ ์ํด ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ณ๋์ Process ์์ Cronjob
์ ํตํด Cache ๋ฅผ ์ต์ ํ์์ผ์ฃผ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์๋ค.
โ Stale Cache Invalidation
Cache ์ ์ ํจ์ฑ์ด ์์ค๋์๊ฑฐ๋ ๋ณ๊ฒฝ๋์์ ๋, ์บ์๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ธฐ์ ์ ์๋ฏธํ๋ค. ์ ํจํ์ง ์์ Cache ๋ฅผ ๊ณ์ ๊ฐ๊ณ ์์๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์์ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค์ค ์ ์๊ฒ ๋๋ฌธ์ ์ด๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๐ฅ ์ฐธ๊ณ
ํด๋น ๊ธ์ ์ธํ๋ฐ ์ ๋ํ
๊ฐ์ฌ๋์ ์ค์ ! Redis ํ์ฉ
๊ฐ์๋ฅผ ๋ณด๋ฉฐ ์์ฑํ์ต๋๋ค.