Replication

  • replicaof ์ปค๋งจ๋“œ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์ œ ์—ฐ๊ฒฐ
  • ๋น„๋™๊ธฐ์‹ ๋ณต์ œ
  • Master๊ฐ€ ๋‹ค์šด๋˜๋”๋ผ๋„ Replica๊ฐ€ ์„œ๋น„์Šค๋ฅผ ๊ณ„์† ํ•  ์ˆ˜ ์žˆ์Œ
  • HA ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ์žฅ์•  ์ƒํ™ฉ ์‹œ ์ˆ˜๋™ ๋ณต๊ตฌ
    • replicaof no one
    • ์„œ๋ฒ„ ๋‹ค์šด์‹œ AOF ๋˜๋Š” RDB๋กœ ์žฌ์‹œ์ž‘
  • replication ๊ณผ์ •์—์„œ fork๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ํŠน์ • ์ปค๋งจ๋“œ disable ํ•˜๊ธฐ

 

Sentinel

์„ผํ‹ฐ๋„์€ ์ผ๋ฐ˜ ๋…ธ๋“œ๋“ค์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง(monitoring)ํ•˜๋Š” ์—ญํ• 

์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„ ๊ฐ€๋Šฅํ•œ HA ๊ตฌ์„ฑ

  • ๋งˆ์Šคํ„ฐ๊ฐ€ ๋น„์ •์ƒ์ด๋ฉด ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„(Automatic Failover)
  • ์—ฐ๊ฒฐ ์ •๋ณด ๋ณ€๊ฒฝ ํ•„์š” ์—†์Œ
  • ์„ผํ‹ฐ๋„ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ 3๋Œ€ ์ด์ƒ, ํ™€์ˆ˜๋กœ ์กด์žฌํ•ด์•ผ ํ•จ
    • ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์„ผํ‹ฐ๋„์ด ๋™์˜ํ•ด์•ผ ํŽ˜์ผ์˜ค๋ฒ„ ์ง„ํ–‰
    • ์˜ˆ) ๋„คํŠธ์›Œํฌ์˜ ์ž ๊น์˜ ์˜ค๋ฒ„ํƒ€์ž„ ๋•Œ๋ฌธ์— ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์ฃฝ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•˜๋‚˜์˜ ์„ผํ‹ฐ๋„์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์„ผํ‹ฐ๋„์ด "OK"ํ•ด์•ผ ๋น„๋กœ์†Œ ๊ทธ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋Š” ์ฃฝ์€ ๊ฒƒ์ด๊ณ , ๊ทธ๋•Œ Replica์—์„œ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋ฅผ ์„ ์ถœํ•œ๋‹ค.
  • ์•Œ๋ฆผ : ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ํŽ˜์ผ์˜ค๋ฒ„ ๋˜์—ˆ์„ ๋•Œ Pub/Sub์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํด๋ผ์ด์–ธํŠธ)์—๊ฒŒ ์•Œ๋ฆฌ๊ฑฐ๋‚˜ shell script๋กœ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ด๋ฉ”์ผ์ด๋‚˜ SMS์œผ๋กœ ์•Œ๋ฆผ ๊ฐ€๋Šฅ

 

Cluster

์Šค์ผ€์ผ ์•„์›ƒ๊ณผ HA ๊ตฌ์„ฑ

 

  • ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์ž๋™์œผ๋กœ ๋ถ„ํ• ํ•ด์„œ ์ €์žฅ (์ƒค๋”ฉ)
  • ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฐ์‹œํ•˜๋ฉฐ ๋งˆ์Šคํ„ฐ ๋น„์ •์ƒ ์ƒํƒœ์ผ ๋•Œ ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„
  • ์ตœ์†Œ 3๋Œ€์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ ํ•„์š”

 

์•„ํ‚คํ…์ฒ˜ ์„ ํƒ ๊ธฐ์ค€

๋ฐ์ดํ„ฐ ์šด์˜๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ redis์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

Redis๋Š” In-memory ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด

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

 

AOF

Append Only File ๋ฐฉ์‹

  • ๋ชจ๋“  write/update ์ปค๋งจ๋“œ๋ฅผ log ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๋Š” ํ˜•ํƒœ
  • redis ํ”„๋กœํ† ์ฝœ ํ˜•ํƒœ๋กœ ์ €์žฅ

RDB

snapshot ๋ฐฉ์‹

  • ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋‚ด์šฉ์„ disk์— ์˜ฎ๊ฒจ๋‹ด๋Š” ๋ฐฉ์‹
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์ €์žฅ

 

AOF vs RDB ์„ ํƒ ๊ธฐ์ค€

redis๋ฅผ ์บ์‹œ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‘˜ ๋‹ค ์“ธ ํ•„์š” ์—†๋‹ค.

1. ๋ฐฑ์—…์€ ํ•„์š”ํ•˜์ง€๋งŒ ์–ด๋А ์ •๋„ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ๋ฐœ์ƒํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ

  • RDB ๋‹จ๋… ์‚ฌ์šฉ
  • redis.conf ํŒŒ์ผ์—์„œ SAVE ์˜ต์…˜์„ ์ ์ ˆํžˆ ์‚ฌ์šฉ
    • ex) SAVE 900 1 → 900์ดˆ ๋™์•ˆ 1๊ฐœ ์ด์ƒ์˜ ํ‚ค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ RDB ํŒŒ์ผ์„ ์žฌ์ž‘์„ฑํ•ด๋ผ

2. ์žฅ์•  ์ƒํ™ฉ ์ง์ „๊นŒ์ง€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  • AOF ์‚ฌ์šฉ
  • APPENDSYNC ์˜ต์…˜์ด everysec์ธ ๊ฒฝ์šฐ ์ตœ๋Œ€ 1์ดˆ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์œ ์‹ค ๊ฐ€๋Šฅ(default)

3. ์ œ์ผ ๊ฐ•๋ ฅํ•œ ๋‚ด๊ตฌ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

  • RDB์™€ AOF ๋™์‹œ ์‚ฌ์šฉ

๋ฐ์ดํ„ฐ ์œ ํ˜•๊ณผ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํŒจํ„ด์„ ์ž˜ ๊ณ ๋ คํ•ด์„œ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

์ฝ๊ธฐ ์ „๋žต

Look-Aside(Lazy Loading)

๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ž‘์—…์ด ๋งŽ์„ ๋•Œ ์‚ฌ์šฉ (๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•)

Cache Hit

  1. ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  2. ๋จผ์ € cache ์„œ๋ฒ„(redis)๋ฅผ ํ™•์ธํ•œ๋‹ค.
  3. cache์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด DB๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ  cache์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (Cache Hit)

Cache Miss

 

  1. ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  2. ๋จผ์ € cache ์„œ๋ฒ„(redis)๋ฅผ ํ™•์ธํ•œ๋‹ค.
  3. cache ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด DB๋ฅผ ์กฐํšŒํ•˜์—ฌ cache ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (Cache Miss)

 

Lazy Loading

cache๋Š” ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ์—๋งŒ ์ž…๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— lazy loading์ด๋ผ๊ณ ๋„ ๋ถ€๋ฆ„

์ด ๊ตฌ์กฐ๋Š” redis๊ฐ€ ๋‹ค์šด๋˜๋”๋ผ๋„ ๋ฐ”๋กœ ์žฅ์• ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ณ  DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ์Œ

 

Cache Warming

๋Œ€์‹  cache์— ๋ถ™์–ด์žˆ๋˜ ์ปค๋„ฅ์…˜์ด ๋งŽ์ด ์žˆ์—ˆ๋‹ค๋ฉด ๊ทธ ์ปค๋„ฅ์…˜์ด ๋‹ค DB์— ๋ถ™๊ฒŒ ๋ผ์„œ DB์— ๊ฐ‘์ž๊ธฐ ๋งŽ์€ ๋ถ€ํ•˜๊ฐ€ ๋ชฐ๋ฆด ์ˆ˜ ์žˆ์Œ

์ด๋Ÿฐ ๊ฒฝ์šฐ cache miss๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ด์„œ ์„ฑ๋Šฅ์— ์ €ํ•˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Œ

→ ๋ฏธ๋ฆฌ DB์—์„œ cache๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด๋„ฃ์–ด ์ฃผ๋Š” ์ž‘์—…

Cache Warming๐Ÿ”ฅ

 

์“ฐ๊ธฐ ์ „๋žต

Write-Around

์ผ๋‹จ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” DB์— ์ €์žฅ๋˜๊ณ  cache miss๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋งŒ cache(redis)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•

์ด ๊ฒฝ์šฐ cache ๋ฐ์ดํ„ฐ์™€ DB ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

Write-Through

DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ cache์—๋„ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

cache๋Š” ํ•ญ์ƒ ์ตœ์‹  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ 

์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ๋‹จ๊ณ„ ์Šคํ…์„ ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ๋‹ค.

 

๋ฌด์กฐ๊ฑด cache์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ข…์˜ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ์–ด

expire time์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

Redis๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋ณ„ ์ปค๋งจ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Key ์„ค์ • ํฌ์ธํŠธ

  • Key๋Š” ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ ์ตœ๋Œ€ 512MB๊นŒ์ง€ ๊ฐ€๋Šฅ
    • ๊ธธ์ด ๋“ฑ ๊ฐ€๋…์„ฑ์„ ๊ณ ๋ คํ•ด์•ผํ•˜๊ณ , ์Šคํ‚ค๋งˆ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•  ๊ฒƒ
    • ex) user:1000:followers

 

Strings

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ Redis ๋ฐ์ดํ„ฐ ์œ ํ˜•

ํ…์ŠคํŠธ, ์ง๋ ฌํ™”๋œ ๊ฐœ์ฒด ๋ฐ ์ด์ง„ ๋ฐฐ์—ด์„ ํฌํ•จํ•œ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ์ €์žฅ, ์ด๋ฏธ์ง€ ์ €์žฅ ๊ฐ€๋Šฅ

์บ์‹ฑ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์นด์šดํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณต

๋‹จ์ผ ๋ฌธ์ž์—ด์€ ์ตœ๋Œ€ 512MB

 

์˜ˆ

  • ๋ฌธ์ž์—ด ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰
> SET user:1 minju
OK
> GET user:1
"minju"
  • ์ง๋ ฌํ™”๋œ JSON ๋ฌธ์ž์—ด ์ €์žฅํ•˜๊ณ  ์ง€๊ธˆ๋ถ€ํ„ฐ 100์ดˆ ํ›„์— ๋งŒ๋ฃŒ๋˜๋„๋ก ์„ค์ •
> SET ticket:27 "\"{'username': 'minju', 'ticket_id': 321}\"" EX 100
  • ์นด์šดํ„ฐ ์ฆ๊ฐ€
> INCR views:page:2
(integer) 1
> INCRBY views:page:2 10
(integer) 11

Bitmaps

String์˜ ํ™•์žฅ, bit ๋‹จ์œ„ ์—ฐ์‚ฐ

๋ฐ์ดํ„ฐ ์ €์žฅ๊ณต๊ฐ„ ์ ˆ์•ฝ

์ •์ˆ˜๋กœ ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์นด์šดํŒ… ๊ฐ€๋Šฅ

๋ฐ์ดํ„ฐ on/off ๊ฐ€๋Šฅ - SETBIT

  • ํ•˜๋ฃจ ์ด ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์„ธ๊ธฐ

 

Lists

๋ฌธ์ž์—ด์˜ ๋ชฉ๋ก

Linked List์™€ ๊ฐ™์€ ํ˜•ํƒœ, ์Šคํƒ๊ณผ ํ ํ˜•ํƒœ ๊ตฌํ˜„

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ ๊ตฌ์ถ•

Blocking ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด Event Queue๋กœ ์‚ฌ์šฉ

  • ํŠธ์œ„ํ„ฐ ํ”ผ๋“œ ๊ธฐ๋Šฅ
    • ํ‚ค๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๋Šฅ - LPUSHX / RPUSHX : ์ด๋ฏธ ์บ์‹ฑ๋˜์–ด ์žˆ๋Š” ํ”ผ๋“œ์—๋งŒ ์‹ ๊ทœ ํŠธ์œ—์„ ์ €์žฅํ•ด์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €์—๊ฒŒ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์Œ

 

์˜ˆ

  •  
  • ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ€๊ธฐ์—ด์ฒ˜๋Ÿผ ์ทจ๊ธ‰(์„ ์ž…์„ ์ถœ)
> LPUSH work:queue:ids 101
(integer) 1
> LPUSH work:queue:ids 237
(integer) 2
> RPOP work:queue:ids
"101"
> RPOP work:queue:ids
"237"
  • ๋ฆฌ์ŠคํŠธ๋ฅผ ์Šคํƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰(์„ ์ž…, ํ›„์ถœ)
> LPUSH work:queue:ids 101
(integer) 1
> LPUSH work:queue:ids 237
(integer) 2
> LPOP work:queue:ids
"237"
> LPOP work:queue:ids
"101"
  • ๋ฆฌ์ŠคํŠธ ๊ธธ์ด ์กฐํšŒ
> LLEN work:queue:ids
(integer) 0
  • ํ•œ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๋ฅผ atomicํ•˜๊ฒŒ popํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชฉ๋ก์œผ๋กœ push
> LPUSH board:todo:ids 101
(integer) 1
> LPUSH board:todo:ids 273
(integer) 2
> LMOVE board:todo:ids board:in-progress:ids LEFT LEFT
"273"
> LRANGE board:todo:ids 0 -1
1) "101"
> LRANGE board:in-progress:ids 0 -1
1) "273"
  • 100๊ฐœ๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค(LTRIM) ํ˜ธ์ถœ(LPUSH)
> LPUSH notifications:user:1 "You've got mail!"
(integer) 1
> LTRIM notifications:user:1 0 99
OK
> LPUSH notifications:user:1 "Your package will be delivered at 12:01 today."
(integer) 2
> LTRIM notifications:user:1 0 99
OK

Hashes

ํ•˜๋‚˜์˜ key ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ field-value ์Œ์˜ ์ปฌ๋ ‰์…˜

field = subkey, field ๊ฐœ์ˆ˜๋Š” ์ œํ•œ ์—†์Œ

๊ธฐ๋ณธ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์นด์šดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์ €์žฅ

 

์˜ˆ

  • ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์„ ํ•ด์‹œ๋กœ ๋‚˜ํƒ€๋ƒ„
> HSET username:123 username minju firstName Minju lastName Jeon country KR
(integer) 4
> HGET user:123 username
"minju"
> HGETALL user:123
1) "username"
2) "minju"
3) "firstName"
4) "Minju"
5) "lastName"
6) "Jeon"
7) "country"
8) "KR"
  • ์žฅ์น˜ 777์ด ์„œ๋ฒ„์— ํ•‘์„ ๋ณด๋‚ด๊ฑฐ๋‚˜, ์š”์ฒญ์„ ๋ฐœํ–‰ํ•˜๊ฑฐ๋‚˜, ์˜ค๋ฅ˜ ๋ณด๋‚ธ ํšŸ์ˆ˜์— ๋Œ€ํ•œ ์นด์šดํ„ฐ ์ €์žฅ
> HINCRBY device:777:stats pings 1
(integer) 1
> HINCRBY device:777:stats pings 1
(integer) 2
> HINCRBY device:777:stats pings 1
(integer) 3
> HINCRBY device:777:stats errors 1
(integer) 1
> HINCRBY device:777:stats requests 1
(integer) 1
> HGET device:777:stats pings
"3"
> HMGET device:777:stats requests errors
1) "1"
2) "1"

Sets

๊ณ ์œ ํ•œ ๋ฌธ์ž์—ด, ์ค‘๋ณต X, ์ •๋ ฌX → ์ง‘ํ•ฉ

๊ณ ์œ ํ•œ ํ•ญ๋ชฉ ์ถ”์ (์˜ˆ: ์ง€์ •๋œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ชจ๋“  ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ ์ถ”์ )

๊ด€๊ณ„ ๋‚˜ํƒ€๋‚ด๊ธฐ(์˜ˆ: ์ฃผ์–ด์ง„ ์—ญํ• ์„ ๊ฐ€์ง„ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ง‘ํ•ฉ)

๊ต์ง‘ํ•ฉ, ํ•ฉ์ง‘ํ•ฉ ๋“ฑ ์ผ๋ฐ˜์ ์ธ ์ง‘ํ•ฉ ์—ฐ์‚ฐ ์ˆ˜ํ–‰

 

์˜ˆ

  • ์‚ฌ์šฉ์ž 123 ๋ฐ 456์˜ ์ฆ๊ฒจ์ฐพ๋Š” ์ฑ… ID set ์ €์žฅ
> SADD user:123:favorites 347
(integer) 1
> SADD user:123:favorites 561
(integer) 1
> SADD user:123:favorites 742
(integer) 1
> SADD user:456:favorites 561
(integer) 1
  • ์‚ฌ์šฉ์ž 123์ด ์ฑ… 742์™€ 299๋ฅผ ์ข‹์•„ํ•˜๋Š”์ง€ ์กฐํšŒ
> SISMEMBER user:123:favorites 742
(integer) 1
> SISMEMBER user:123:favorites 299
(integer) 0
  • ์‚ฌ์šฉ์ž 123๊ณผ 456์ด ๊ณตํ†ต์ ์œผ๋กœ ์ข‹์•„ํ•˜๋Š” ์ฑ… ์กฐํšŒ
> SINTER user:123:favorites user:456:favorites
1) "561"
  • ์‚ฌ์šฉ์ž 123์ด ์ข‹์•„ํ•˜๋Š” ์ฑ…์ด ๋ช‡ ๊ถŒ์ธ์ง€ ์กฐํšŒ
> SCARD user:123:favorites
(integer) 3

Sorted Sets

์ •๋ ฌ๋œ ๊ณ ์œ ํ•œ ๋ฌธ์ž์—ด set

key, value์—์„œ score๊นŒ์ง€ ํ•จ๊ป˜ ์ €์žฅ → ๋‘˜ ์ด์ƒ์˜ score ๊ฐ’์ด ๋™์ผํ•  ๊ฒฝ์šฐ ์‚ฌ์ „์ˆœ ์ •๋ ฌ

  • ์ˆœ์œ„ํ‘œ. ์˜ˆ๋ฅผ ๋“ค์–ด ๋Œ€๊ทœ๋ชจ ์˜จ๋ผ์ธ ๊ฒŒ์ž„์—์„œ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก์„ ์‰ฝ๊ฒŒ ์œ ์ง€ ๊ด€๋ฆฌ
  • ์†๋„ ์ œํ•œ๊ธฐ. ๊ณผ๋„ํ•œ API ์š”์ฒญ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์†๋„ ์ œํ•œ๊ธฐ ๊ตฌ์ถ•

์˜ˆ

  • ํ”Œ๋ ˆ์ด์–ด์˜ ์ ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์‹ค์‹œ๊ฐ„ ์ˆœ์œ„ํ‘œ ์—…๋ฐ์ดํŠธ
> ZADD leaderboard:455 100 user:1
(integer) 1
> ZADD leaderboard:455 75 user:2
(integer) 1
> ZADD leaderboard:455 101 user:3
(integer) 1
> ZADD leaderboard:455 15 user:4
(integer) 1
> ZADD leaderboard:455 275 user:2
(integer) 0
  • ์ƒ์œ„ 3๋ช…์˜ ํ”Œ๋ ˆ์ด์–ด ์ ์ˆ˜ ์กฐํšŒ
> ZRANGE leaderboard:455 0 2 REV WITHSCORES
1) "user:2"
2) "275"
3) "user:3"
4) "101"
5) "user:1"
6) "100"
  • ์‚ฌ์šฉ์ž 2์˜ ๋“ฑ๊ธ‰ ์กฐํšŒ
> ZREVRANK leaderboard:455 user:2
(integer) 0

HyperLogLogs(HLL)

2007๋…„ Philippe Flajolet์ด ๋ฐœํ‘œํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์‹œ๊ฐ„๋ณต์žก๋„ O(1)๋กœ ํšจ์œจ์ ์ธ ๊ณต๊ฐ„ ํ™œ์šฉ์„ ์œ„ํ•ด unique count๋ฅผ ํ†ตํ•œ ์™„๋ฒฝํ•œ ์ •ํ™•๋„ ์ œ๊ณต, set์˜ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋จ

ํ™•๋ฅ ์  ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์ถ”์ • ์›๋ฆฌ : https://d2.naver.com/helloworld/711301

์ตœ๋Œ€ 12KB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  0.81%์˜ ์˜ค๋ฅ˜ ์ œ๊ณต

count๋งŒ ์…€๋ฟ์ด์–ด์„œ value๋Š” ์ €์žฅํ•˜์ง€ ์•Š์Œ (๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ)

AWS ์—˜๋ผ์Šคํ‹ฑ์บ์‹œ, ํด๋ผ์šฐ๋“œ ๋ฏธํ„ฐ๋ง(๋ˆ์„ ๋งค๊ธฐ๋Š” ์ง€ํ‘œ)

 

์˜ˆ

  • ๋ช‡ ๊ฐ€์ง€ ํ•ญ๋ชฉ ์ถ”๊ฐ€
> PFADD members 123
(integer) 1
> PFADD members 500
(integer) 1
> PFADD members 12
(integer) 1
  • set์˜ ๊ตฌ์„ฑ์› ์ˆ˜ ์ถ”์ •
> PFCOUNT members
(integer) 3

Streams

์‹ ๊ทœ ๊ธฐ๋Šฅ

append-only ๋กœ๊ทธ, ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ธฐ์— ์ตœ์ ์˜ ์ž๋ฃŒ๊ตฌ์กฐ

๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ ํŠนํ™”

์‹ค์‹œ๊ฐ„์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋™์‹œ์— syndicate ํ•œ๋‹ค. (์ผ๊ด„์ ์œผ๋กœ ..??)

kafka์—์„œ ์˜ํ–ฅ์„ ๋ฐ›์Œ

  • ์ด๋ฒคํŠธ ์†Œ์‹ฑ(์˜ˆ: ์‚ฌ์šฉ์ž ์ž‘์—…, ํด๋ฆญ ์ถ”์  ๋“ฑ)
  • ์„ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋ง(์˜ˆ: ํ˜„์žฅ ์žฅ์น˜์˜ ํŒ๋…๊ฐ’)
  • ์•Œ๋ฆผ(์˜ˆ: ๊ฐ ์‚ฌ์šฉ์ž์˜ ์•Œ๋ฆผ ๊ธฐ๋ก์„ ๋ณ„๋„์˜ ์ŠคํŠธ๋ฆผ์— ์ €์žฅ)

๊ฐ ์ŠคํŠธ๋ฆผ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ID๋ฅผ ์ƒ์„ฑ → ๋‚˜์ค‘์— ์—ฐ๊ฒฐ๋œ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ํ›„์† ํ•ญ๋ชฉ ์ฒ˜๋ฆฌ

์—ฌ๋Ÿฌ ํŠธ๋ฆฌ๋ฐ ์ „๋žต(์ŠคํŠธ๋ฆผ์ด ๋ฌด์ œํ•œ์œผ๋กœ ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€)๊ณผ ๋‘˜ ์ด์ƒ์˜ ์†Œ๋น„ ์ „๋žต(XREAD, XREADGROUP, ๊ณผ XRANGE)์„ ์ง€์›

 

์˜ˆ

  • ์ŠคํŠธ๋ฆผ์— ์—ฌ๋Ÿฌ ์˜จ๋„ ํŒ๋…๊ฐ’ ์ถ”๊ฐ€
> XADD temperatures:us-ny:10007 * temp_f 87.2 pressure 29.69 humidity 46
"1658354918398-0"
> XADD temperatures:us-ny:10007 * temp_f 83.1 pressure 29.21 humidity 46.5
"1658354934941-0"
> XADD temperatures:us-ny:10007 * temp_f 81.9 pressure 28.37 humidity 43.7
"1658354957524-0"
  • ID์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ฒ˜์Œ ๋‘ ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ ํ•ญ๋ชฉ ์กฐํšŒ
> XRANGE temperatures:us-ny:10007 1658354934941-0 + COUNT 2
1) 1) "1658354934941-0"
   2) 1) "temp_f"
      2) "83.1"
      3) "pressure"
      4) "29.21"
      5) "humidity"
      6) "46.5"
2) 1) "1658354957524-0"
   2) 1) "temp_f"
      2) "81.9"
      3) "pressure"
      4) "28.37"
      5) "humidity"
      6) "43.7"
  • ์ŠคํŠธ๋ฆผ์˜ ๋์—์„œ ์‹œ์ž‘ํ•ด์„œ ์ตœ๋Œ€ 100๊ฐœ์˜ ์ƒˆ ์ŠคํŠธ๋ฆผ์„ ์ฝ๊ณ  ํ•ญ๋ชฉ์ด ๊ธฐ๋ก๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ตœ๋Œ€ 300ms ๋™์•ˆ ์ฐจ๋‹จ
> XREAD COUNT 100 BLOCK 300 STREAMS temperatures:us-ny:10007 $
(nil)

 

๋ฐ์ดํ„ฐ ํƒ€์ž…๋ณ„ ์ปค๋งจ๋“œ

https://redis.io/commands/

 

Commands

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker

redis.io

 

redis๋ž€?

โœ… ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Redis๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์บ์‹œ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์—”์ง„์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ ์†Œ์Šค(BSD ๋ผ์ด์„ผ์Šค), ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. Redis๋Š” strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Redis๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๋ณต์ œ, Lua ์Šคํฌ๋ฆฝํŒ…, LRU ์ œ๊ฑฐ, ํŠธ๋žœ์žญ์…˜ ๋ฐ ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์˜ ์˜จ๋””์Šคํฌ ์ง€์†์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฉฐ Redis Sentinel์„ ํ†ตํ•œ ๊ณ ๊ฐ€์šฉ์„ฑ ๋ฐ Redis ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ†ตํ•œ ์ž๋™ ํŒŒํ‹ฐ์…”๋‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

redis๋Š” remote dictionary server์˜ ์ค„์ž„๋ง์ž…๋‹ˆ๋‹ค.

์‚ฌ์ „ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, key-value ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

redis๋Š” db-engines.com์—์„œ key, value ์ €์žฅ์†Œ ์ค‘ ๊ฐ€์žฅ ๋†’์€ ์ˆœ์œ„์ž…๋‹ˆ๋‹ค.

2023๋…„ 1์›” 18์ผ ๊ธฐ์ค€

 

ํŠน์ง•

  • key-value ๊ตฌ์กฐ์˜ NoSQL
    • ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • In-Memory ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • ๋งค์šฐ ๋น ๋ฅธ ์†๋„
    • ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์œ ์˜ ํ•„์š”
    • ๋ณต์ œ์™€ ๋ฐฑ์—…์€ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณต์ œ๋กœ๋Š” ๋ณต์›์ด ๋ถˆ๊ฐ€, ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ฃผ๊ธฐ์  ๋ฐฑ์—… ํ•„์š”
  • ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ง€์›
    • sorted sets ํƒ€์ž…์„ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋จ๊ณผ ๋™์‹œ์— ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๋žญํ‚น ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์— ์œ ์šฉํ•จ
    • application ๋‹จ์—์„œ ์ž‘์„ฑํ•  ๋กœ์ง์„ redis๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ์ž๋ฃŒ๊ตฌ์กฐ ๋ณ„๋กœ ๋‹ค๋ฅธ ์ปค๋งจ๋“œ ์ œ๊ณต
  • Single Thread ๋ฐฉ์‹ ๋™์ž‘
    • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ช…๋ น๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ธด ๋ช…๋ น์–ด๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋’ค ๋ช…๋ น์–ด๋“ค์€ ์•ž์— ์žˆ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
    • ํ•˜์ง€๋งŒ get, set ๋ช…๋ น์–ด์˜ ๊ฒฝ์šฐ ์ดˆ๋‹น 10๋งŒ ๊ฐœ ์ด์ƒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๋น ๋ฆ„
    • atomic์„ ๋ณด์žฅํ•˜๊ณ , race condition์„ ํšŒํ”ผ
  • ๋ฒ„์ „ 6.x๋ถ€ํ„ฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ถ€๋ถ„์—๋งŒ Multi Thread ๋„์ž…
    • ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์†กํ•œ ๋ช…๋ น์„ ์ฝ๊ณ  ํŒŒ์‹ฑํ•˜๋Š” ๋ถ€๋ถ„
    • ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•˜๋Š” ๋ถ€๋ถ„
    • (์ฃผ์˜) ๋ช…๋ น์–ด ์‹คํ–‰ ์ž์ฒด๋Š” ์œ„์˜ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋ผ๊ณ  ๋ด์•ผํ•จ

 

์™œ ์“ธ๊นŒ?

DB๊ฐ€ ์žˆ๋Š”๋ฐ๋„ redis๋ผ๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

 

์„œ๋น„์Šค์˜ ์œ ์ €๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ์œ ์ €์˜ ์š”์ฒญ์„ DB ์ ‘๊ทผ์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด DB ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šคํ‚ค๋งˆ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์–ด ํฐ ์ €์žฅ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ํ…Œ์ด๋ธ”์—๋Š” ์ปฌ๋Ÿผ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž DB๋ฅผ ์Šค์ผ€์ผ ์ธ, ์Šค์ผ€์ผ ์•„์›ƒ ํ•˜๋Š” ๋ฐฉ์‹ ์™ธ์— ์บ์‹œ ์„œ๋ฒ„๋กœ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด redis ์ž…๋‹ˆ๋‹ค.

 

์บ์‹œ๋Š” ํ•œ๋ฒˆ ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์Œ์— ์ฝ์„ ๋•Œ๋Š” ๋น ๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™์ž‘ํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๊ฐ™์€ ์š”์ฒญ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์บ์‹œ ์„œ๋ฒ„์—์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ”๋กœ ๋‚ด๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— DB์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ์„œ๋น„์Šค ์†๋„๋„ ๋А๋ ค์ง€์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

+ Recent posts