Redis
์ผ๋ฐ์ ์ผ๋ก ๋ ๋์ค๋ผ ํ์ ๋ ๋ ์ค๋ฅด๋ ์ด๋ฏธ์ง๋,
DB์ ์ ๊ทผํ๋ ๊ฒ์ด ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ DB ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ์ ์ฅํ๋ ์บ์ ์ญํ ์ Key-Value Store๋ผ๊ณ ์๊ณ ์๋ค.
๋๋ต์ ์ผ๋ก ์ด์ ๋๋ ์์ง๋ง, ์ ํํ๋ ์ ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฒ์ ์ ๋ฆฌ๋ฅผ ํ๋ฒ ํด๋ณด๊ณ ์ ํ๋ค
์ต๊ทผ ์ด์
Redis๋ ์๋๋ ์คํ์์ค์์ผ๋, ์ต๊ทผ์ ๋ผ์ด์ผ์ค๊ฐ ๋ณ๊ฒฝ๋์ด ๋์ด์ ์คํ์์ค๊ฐ ์๋๊ฒ ๋์๋ค
- ๋คํ(?)์ธ ์ ์ ๊ธฐ์กด ๊ฐ๋ฐ์ ์ค ๋ช๋ช ์ด Fork๋ฅผ ๋ ์ ๊ฐ์ง๊ณ ๋์์ ValKey๋ผ๋ ์คํ ์์ค๋ฅผ ๋ง๋ค๊ฒ ๋์๋ค
- ValKey๋ ํ์ฌ Linux์ ์ฌ๋จ์์ ๊ด๋ฆฌ๋ฅผ ํ๊ณ ์๊ณ , ์ด๋ฏธ ๋ง์ ์ฌ์ฉ์๋ค์ด ValKey๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค
- Fork๋ฅผ ๋ ์จ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํ์ฌ๊น์ง๋ ์ฌ์ฉ๋ฒ์ ํฐ ์ฐจ์ด๊ฐ ์๋ค
Redis?
๋ ๋์ค๋ ๋ฌด์์ธ๊ฐ
- In-Memory Cache
- In-Memory NoSQL
- Key-Value Store
๊ณตํต์ ์ผ๋ก ๋ค์ด๊ฐ ๋จ์ด๊ฐ In-Memory
์ด๋ค.
๋ ๋์ค๋ In-Memory์์ ๋์์ ํ๋ค
In-Memory๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋์คํฌ์ ์ ๊ทผํ๋ ๊ฒ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ๊ฒ์ด ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ
์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ์ฃผ์ฒด๋ CPU์ด๊ธฐ ๋๋ฌธ์, ๋ ๋์ค์ ์ฑ๋ฅ์ CPU์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฐ๋๋ค
(์ข์ CPU๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋์ค์ ์ฑ๋ฅ๋ ์ฌ๋ผ๊ฐ!)
๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ
Memory Hierarchy
- ์๋ค์ํผ ๋ฉ๋ชจ๋ฆฌ๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๊ณ ์๋ค
- ์๋๋ก ๊ฐ์๋ก ๋๋ฆฌ์ง๋ง ์ฉ๋์ ํฌ๊ณ ๊ฐ์ด ์ผ ์ ์ฅ์ฅ์น
- Second์ Millisecond๋ 1,000๋ฐฐ ์ฐจ์ด
- Millisecond์ Microsecnd๋ 1,000๋ฐฐ ์ฐจ์ด
- Microsecond์ Nanosecond๋ 1,000๋ฐฐ ์ฐจ์ด
- ๋ฐ๋ผ์ RAM์ ์ ๊ทผํ๋ ๊ฒ๊ณผ ๋์คํฌ์ ์ ๊ทผํ๋ ๊ฒ์ ์ด๋ง์ด๋งํ ์๋ ์ฐจ์ด๊ฐ ๋ฐ์ (๋๋ต 10๋ง ๋ฐฐ)
- L1, L2, L3 ์บ์๋ CPU ๊ทผ์ฒ์ ๋ถ์ด์๋ ์๊ณ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ
- ์บ์(Cache)๋ผ๋ ๊ฐ๋ ์ ๋๋ฆฐ ์ฅ์น์ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ๋น ๋ฅธ ์ฅ์น์ ์ฌ๋ ค๋๊ณ ์ฌ์ฉ ํ๋ ๊ฒ
- DB๋ ์ด๋น 1,000 TPS(Transaction Per Second)์ ์ฑ๋ฅ
- ์ด๋น 1,000๋ฒ์ DB ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค๋ ๋ป
Kafka?
๋ฒ์ธ์ด์ง๋ง, Kafka๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋๋ฐ๋ ๊ต์ฅํ ๋น ๋ฅด๋ค๋๋ฐ?
- Sequential Access is faster than Random Access !
- ์นดํ์นด๋ Sequential Access๋ฅผ ์ฌ์ฉ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋๋ฐ๋ ๋น ๋ฅธ ์๋๋ฅผ ๊ฐ์ง ์ ์๋ค
- ๋์คํฌ์ ๊ฒฝ์ฐ์๋ Random Access๋ฅผ ํ๊ฒ ๋๋ฉด, ๋งค๋ฒ ๋ฌผ๋ฆฌ์ ์ธ ํค๋๋ฅผ ์์ง์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ต์ฅํ ๋๋ฆฌ๋ค
- ๋๋ฆฐ ์ ์ฅ ์ฅ์น์ ๊ฒฝ์ฐ์๋ ์ฐ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ ์จ๋๊ณ ์ฐ์์ ์ผ๋ก ์ญ ์ฝ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค
- DB ์ธ๋ฑ์ฑ์ ์ฌ์ฉ๋๋ ์๋ฃ ๊ตฌ์กฐ๋ B-Tree, B+Tree
- B-Tree, B+Tree๋ ๊ธฐ๋ณธ์ด Random Access
Memory๋ Random Access๋ ๊ต์ฅํ ๋น ๋ฅด๋ค!
=> ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ In-Memory๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ ๊ตณ์ด Sequential Access๋ฅผ ํ์ง ์๋๋ค
In-Memory Cache Solution
In-Memory Solution์ ์์ฒญ ๋ง๋ค
- Memcached
- Redis
- Hazelcast
- Infinispan
- Couchbase
์ด ์ค์์๋ Redis๊ฐ ์๋์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ค
Redis๊ฐ ์ ๋ช
ํ ์ด์ ?
๋น ๋ฅด๋ฉด์๋ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๊ณต ํ๊ธฐ ๋๋ฌธ
๋ค์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๊ฒ ๋๋ฉด, ๊ฐ๋ฐ์ด ํจ์ฌ ํธํด์ง๋ค!
Redis ์ฌ์ฉ ๋ถ์ผ
Redis๋ ์ด๋ค ์์ผ๋ก ์ฌ์ฉ๋ ๊น?
- Cache
- Session Store
- Distributed Lock
- Rate Limiter
- LeaderBoard
- Queue
Cache
- Data Entity๋ฅผ DB์์ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ์๋๋ผ ๋ ๋น ๋ฅธ ์ ์ฅ ๋งค์ฒด์ธ Redis์ 1์ฐจ์ ์ผ๋ก ์ ์ฅ ํด๋๋ ๊ฒ
- Cache ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด Redis ์ฌ์ฉ์ 95% ์ ๋
- ๋ค์ํ ํ์ ์ ๋ค์ํ ์ ๋ณด๋ฅผ ํ์์ ๋ฐ๋ผ์ ์ ์ฅํ ์ ์๋ค
- ์ ์ฒด ๋์คํฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๋นํด ์บ์์ ์ ์ฅํ ์ ์๋ ์ฉ๋์ ๋งค์ฐ ์์๋ฐ, ์ด๋ป๊ฒ ํจ๊ณผ๊ฐ ์์๊น?
- 2๋8์ ๋ฒ์น (ํ๋ ํ ์ ๋ฒ์น)
- ํธ๋ํฝ์ 80%๋ DB์ 20%์ด๋ค
- ์ด 20%๋ฅผ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๊ณ ์ฌ์ฉํ๋ฉด 80%์ ์ฑ๋ฅ ๊ฐ์ ์ด ์ผ์ด๋๋ค๋ ๋ป
- ์๋น์ค๋ฅผ ํ ๋, ๋ฐ์ดํฐ์ ์ต์ฑ์ ์๊ณ ์บ์๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ํ์ํ๋ค
- ๋ง์ฝ ๋งค๋ฒ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ ๊ทผ์ ํ๋ค๋ฉด, ์บ์๊ฐ ์ฌ์ค ํฐ ํ์ ๋ฐํํ์ง ๋ชปํ๋ค
- 2๋8์ ๋ฒ์น (ํ๋ ํ ์ ๋ฒ์น)
Distributed Cache
- ๋ฐ์ดํฐ๊ฐ ๋ง๋ค๋ฉด, ํ๋์ Cache Server๊ฐ ์๋๋ผ ์ฌ๋ฌ ์บ์ ์๋ฒ๋ฅผ ๊ตฌ์ฑ ํ ์ ์๋ค
- Ex) Redis with Range, Redis with PreShard, Redis with Consistent Hashing
- ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋๋ ์ ์ ์ฅํ๋ ๊ฒ
Quiz
์์ ๊ฐ์ด ์บ์๊ฐ A,B๋ก ๋๋์ด์ ธ ์๊ณ , 1~9๊น์ง์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ํ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ์์ผ๋ก ๋๋ ์ ์ ์ฅํ ์ ์์๊น?
- ํ์ง์ผ๋ก ๋๋๋ค
- ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ฐ์ผ๋ก ๋๋๋ค => A์๋ 1~5๊น์ง, B์๋ 6~9๊น์ง
- ๋ฌด์์๋ก ๋๋๋ค
1,2๋ฒ๊ณผ ๊ฐ์ด ์ด๋ค ๊ท์น์ด ์ ์ฉ๋์ด ์๋ค๋ฉด, ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ ํ๋์ ์บ์ ์๋ฒ๋ง ํ์ธํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์บ์์ ์๋์ง ์๋์ง ๋ฐ๋ก ์ ์ ์๋ค
๊ทธ๋ฐ๋ฐ A,B ์บ์ ์ธ์ C๋ผ๋ ์บ์๊ฐ ํ๋ ๋ ์์ฑ๋์๋ค๋ฉด?
- ํ์ง(Modulo ๋ฐฉ์)์ผ๋ก ๋๋๊ฒ ๋๋ฉด, C๋ผ๋ ์๋ก์ด ์บ์๊ฐ ์๊ฒผ์ ๋ ์ฌ๋ฐฐ์น๊ฐ ํ์ํ๋ค
- Range๋ก ํ๊ฒ ๋๋ฉด, ํน์ ๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ง์์ง๊ฒ ๋๋ฉด, ํด๋น ์บ์๋ ๋๊ฒ ๋๋ค
=> ๊ฒฐ๊ตญ์ ์ฌ๋ฐฐ์น๊ฐ ํ์
๊ฒฐ๋ก : ์ด๋ป๊ฒ ์ ์ฅํด๋ ์ฌ๋ฐฐ์น๊ฐ ํ์ ํ๋ค
- ์ฌ๋ฐฐ์น๋ฅผ ์ต๋ํ ์ค์ผ ์ ์๋ ๋ฐฉํฅ์ผ๋ก ์บ์๋ฅผ ์ค๊ณํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค
Redis With Range
ํน์ Key์ Range๋ก ๊ตฌ๋ถ
- ID๊ฐ 50์ธ ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ค! ๋ผ๊ณ ํ์ ๋ ID๊ฐ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ถ์ฐ๋์ด ์๋ค๋ฉด, ์ด๋ค DB์ ์์ฒญ์ ๋ณด๋ด์ผ ํ ์ง ๋ฐ๋ก ์ ์๊ฐ ์๋ค
Redis With Preshard
Hash slot์ 16348๊ณผ ๊ฐ์ ์ซ์๋ก ๋ฏธ๋ฆฌ ๋๋ ๋๊ณ ํด๋น ์๋ฒ์ ์ ์ฅ
- Redis Cluster๋ ์ผ์ข ์ PreShard ๊ตฌ์กฐ (crc16์ผ๋ก hash)
- hash(key) % 16384
Redis With Consistent Hashing
Consistent Hashing์ ํตํด์ Key๋ฅผ ๋ถํ
- ์์ด์ ธ๋ ๋ค์ ๋ง๋ค ์ ์๋ Cache ํํ์ ์ ํฉ
- Consistent Hashing ์ ๋จ์
- HashRing์ ๊ท ๋ฑํ๊ฒ ๊ตฌ์ฑํ๋๋ผ๋ ๋ถํ๋ ๊ท ๋ฑํ๊ฒ ๋ชฐ๋ฆฌ์ง ์๋๋ค
- ํ์ํ ๊ฐ์๋ณด๋ค ๋ ๋ง์ ๋ ธ๋๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ๋ฐ์
Session Store
Session์ ๊ฐ๋ณ์๋ฒ๋, ํด๋ฌ์คํฐ๋ง์ด ์๋๋ผ ์ธ๋ถ ์คํ ๋ฆฌ์ง(Redis)์ ์ ์ฅ
- ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋, ์ธ์ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํ๋ค
- ์ด๋ ์ธ์ ์ ๋ณด(์ธ์ ์คํ ์ด)๋ฅผ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋ ๋์ง๋ง, ๋ ๋์ค๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค
- ์๋ฒ๋ง๋ค ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด, ์๋ก๊ฐ์ Sync๋ฅผ ๋ง์ถฐ์ฃผ๊ธฐ ์ํด์ ์ฑ๋ฅ์ด ์ ํ๋๋ค
- ๊ทธ๋์ ๊ทธ๋ฅ ํ๋์ ์ธ๋ถ ์คํ ๋ฆฌ์ง๋ก ๋นผ๋ฒ๋ฆฌ๋ ๊ฒ ์ด ์ข์ ์๋ ์๋ค
Distributed Lock
๋ถ์ฐ ๋ฝ์ผ๋ก ๋์
- Optimistic Lock์ผ๋ก ๋์
- key๊ฐ ์กด์ฌํ๋ฉด ๋๊ธฐํ๋ ํํ
- ๋ฐ๋ก ์คํจ๋ก ๊ตฌ์ฑํ ์ง, Spinlock ํํ๋ก ๋์ํ ์ง (Redisson ๊ตฌํ์ฒด) ๋ฑ ๊ณ ๋ฏผ์ ํ์
Locking Algorithm
- setnx๋ฅผ ํธ์ถํ๋ฉด ๋จ ํ๋์ ํ๋ก์ธ์ค๋ง์ด ํค๋ฅผ ๊ฐ์ง ์ ์๋ค
Rate Limiter
- ์ธ๋น DB์ ์ ๊ทผํ ์ ์๋ ํ์๋ฅผ ์ ํํ ๋ ์ฌ์ฉํ๋ค
- ์ ๋ฃ ํ์์ 50ํ, ๋ฌด๋ฃ ํ์์ 10ํ ์ด๋ฐ ๊ฑฐ ํ ๋
- ์ฆ์ ์
๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ์ ์ฅ์๋ก ์ฌ์ฉ๋๋ ์ผ์ด์ค
- ์ผ์ข ์ Write Back ํํ or ์ ์ฉ ์ ์ฅ์๋ก ๋์
- Rate Limiter๋ฅผ ์ํ ์ ๋ณด๋ ์กฐ๊ธ ๋ ์๊ฐ๋ ํด๋ผ์ด์ธํธ์๊ฒ ํผํด๊ฐ๋ ๊ฒ ์๊ธฐ ๋๋ฌธ์ Write Back์ ์ฌ์ฉํด๋ ํฐ ๋ฌธ์ ๊ฐ ์๋ค
- Rate Limiter ์ด์ธ์ View Count ๋ฑ์ ์ ์ฅํ ๋๋ ์ฌ์ฉ๋๋ค
- Rate Limiter ์์ฒด์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์์ ๊ธ์ ์ฐธ๊ณ
Leaderboard
Sorted Set(zset)์ Score๋ฅผ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํ๋ค
- ๋ญํน์ ๋ณด์ฌ์ค์ผ ํ๋ ๊ฒฝ์ฐ์ ๋ง์ด ์ฌ์ฉ
- ๋ฌผ๋ก DB์์ ๊ฐ์ ธ์์ Sorting์ ํด์ ๋ณด์ฌ์ค๋ ๋์ง๋ง, ์ด๊ฑธ ์ฌ์ฉํ๋ ๊ฒ ๋ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ
- Sorted Set์ ์ด ๋ ์ฃผ์ํด์ผ ํ๋ ์ ์ Score๊ฐ Int๊ฐ ์๋๋ผ Float
- ์ค์ํ ๋ฐ์ดํฐ์ ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ผ๋ฉด, ์์ ํ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ธ์๋๋ค
'๊ฐ๋ฐ > Redis' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Redis ์คํํด๋ณด๊ธฐ (0) | 2024.05.28 |
---|---|
Cache์ ์ฌ์ฉ ์ (0) | 2024.04.30 |