๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/Redis

๋ ˆ๋””์Šค ?

by Jaeguk 2024. 4. 13.

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%์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์ผ์–ด๋‚œ๋‹ค๋Š” ๋œป
    • ์„œ๋น„์Šค๋ฅผ ํ•  ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ์Šต์„ฑ์„ ์•Œ๊ณ  ์บ์‹œ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค
      • ๋งŒ์•ฝ ๋งค๋ฒˆ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์„ ํ•œ๋‹ค๋ฉด, ์บ์‹œ๊ฐ€ ์‚ฌ์‹ค ํฐ ํž˜์„ ๋ฐœํœ˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค

 

Distributed Cache


  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ํ•˜๋‚˜์˜ Cache Server๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์บ์‹œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค
    • Ex) Redis with Range, Redis with PreShard, Redis with Consistent Hashing
  • ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋‚˜๋ˆ ์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ

 

Quiz


์œ„์™€ ๊ฐ™์ด ์บ์‹œ๊ฐ€ A,B๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ณ , 1~9๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ €์žฅํ•  ์ˆ˜ ์žˆ์„๊นŒ?

  1. ํ™€์ง์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค
  2. ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค => A์—๋Š” 1~5๊นŒ์ง€, B์—๋Š” 6~9๊นŒ์ง€
  3. ๋ฌด์ž‘์œ„๋กœ ๋‚˜๋ˆˆ๋‹ค

1,2๋ฒˆ๊ณผ ๊ฐ™์ด ์–ด๋–ค ๊ทœ์น™์ด ์ ์šฉ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ํ•˜๋‚˜์˜ ์บ์‹œ ์„œ๋ฒ„๋งŒ ํ™•์ธํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค

๊ทธ๋Ÿฐ๋ฐ A,B ์บ์‹œ ์™ธ์— C๋ผ๋Š” ์บ์‹œ๊ฐ€ ํ•˜๋‚˜ ๋” ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋ฉด?

  1. ํ™€์ง(Modulo ๋ฐฉ์‹)์œผ๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉด, C๋ผ๋Š” ์ƒˆ๋กœ์šด ์บ์‹œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์žฌ๋ฐฐ์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค
  2. 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
    • ์‹ค์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ์— ์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด, ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์ธ์‹๋œ๋‹ค
728x90

'๊ฐœ๋ฐœ > Redis' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Cache์˜ ์‚ฌ์šฉ ์˜ˆ  (0) 2024.04.30