Redis

Redis

CacheDB

Cache

์•ž์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋  ๋ฐ์ดํ„ฐ๋ฅผ ์›๋ณธ ๋ฐ์ดํ„ฐ ์œ„์น˜ ์™ธ์— ๋‹ค๋ฅธ ๊ณณ์— copyํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‘๊ณ ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

  • Cache hit : ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Cache์—์„œ ์ฐพ์„ ๋•Œ
  • Cache miss : ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Cache์—์„œ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋•Œ
  • Hit rate : access ์‹œ๋„ ๋Œ€๋น„ cache hit์˜ ๋น„์œจ


์‚ฌ์šฉ ์‚ฌ๋ก€

  • Cpu ์นฉ ๋‚ด์— L1, L2 โ€ฆ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ์ €์žฅ ํ• ์ˆ˜ ์žˆ๋Š” ์ž‘์€ cache๊ฐ€ ์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ IO์— ์˜ํ•œ ์†๋„ ๊ฐ์†Œ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ธ๋ฑ์‹ฑ ๊ธฐ์ค€ ์กฐํšŒ
  • ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ตœ๊ทผ ๋ฐฉ๋ฌธ ๊ธฐ๋ก ์ž„์‹œ ์ €์žฅ ๋“ฑ
  • ์—…๋ฐ์ดํ„ฐ ํ•  ์ผ์ด ๊ฑฐ์˜ ์—†๋Š” ์ •๋ณด(๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์„ค์ •์ •๋ณด)๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋‘๊ณ , cache ์—…๋ฐ์ดํŠธ


Cache ๊ณ ๋ ค์‚ฌํ•ญ

  • ์–ธ์ œ๋“  ์œ ์‹ค๋  ์ˆ˜ ์žˆ์Œ์„ ๊ณ ๋ คํ•˜์—ฌ ์›๋ณธ ์œ ์ง€์™€ ํ•จ๊ป˜ ์‹œ์Šคํ…œ ์„ค๊ณ„ ํ•„์š”
  • ์šฉ๋Ÿ‰์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ๊ณ , ๋น„์šฉ์ด ๋น„์Œˆ
  • ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์„ ์œ„ํ•ด Cache hit rate๋ฅผ ์ธก์ •ํ•˜๊ณ  ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๊ณ ๋ฏผ


Cache(In-memory) DB๋ž€?

๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅํ•œ ๋’ค, ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐ ์ €์žฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋””์Šคํฌ๋ณด๋‹ค ๊ฐ€๊ฒฉ์ด ๋น„์‹ธ๊ณ , ๋ฉ”๋ชจ๋ฆฌ์˜ ์šฉ๋Ÿ‰ ํ™•์žฅ์—๋„ ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒ์  ์‚ฌ์šฉ ํ•„์š”


Redis ์žฅ์ 

  • CacheDB์˜ ๋ชฉํ‘œ์ธ ๊ฐ€์žฅ ๋น ๋ฅธ ์กฐํšŒ์†๋„๋ฅผ ๋‚ด๊ธฐ ๊ฐ€์žฅ ์‰ฌ์›€
  • ๋ถ„์‚ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ ์ง€์›ํ•˜์—ฌ ํ™•์žฅ์„ฑ ์ œ๊ณต ๊ฐ€๋Šฅ
  • ์ž๋ฃŒ๊ตฌ์กฐ, ๊ธฐ๋Šฅ, ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ๋‹ค.


Redis

Redis์˜ Key

Redis์˜ ๋ชจ๋“  ์ž๋ฃŒ๊ตฌ์กฐ๋Š” key-value ํ˜•์‹์ด๋‹ค.

Key๋Š” binary sequence๋กœ ์•ž์—์„œ๋ถ€ํ„ฐ byte ๋‹จ์œ„๋กœ ๋น„๊ตํ•œ๋‹ค. string(empty string ํฌํ•จ) ์™ธ์— ์–ด๋–ค binary๊ฐ’๋„ ์ƒ๊ด€์ด ์—†๋‹ค.


Key ์„ค๊ณ„ ๊ณ ๋ ค์‚ฌํ•ญ

Avoid long key

key์˜ ๊ธธ์ด๊ฐ€ ๊ธธ๋ฉด, ๋ฉ”๋ชจ๋ฆฌ๋„ ๋” ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ณ , key ๋น„๊ต ์—ฐ์‚ฐ ๋“ฑ์—์„œ๋„ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค.(key์˜ ์ตœ๋Œ€ ์‚ฌ์ด์ฆˆ๋Š” 512MB)

key ๋ฐ์ดํ„ฐ๊ฐ€ ํฌ๋‹ค๋ฉด, hashing์„ ํ†ตํ•ด key์˜ uniqueํ•จ๋„ ๋ณด์žฅํ•˜๋ฉฐ ํŠน์ • ๊ธธ์ด๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ• ์ถ”์ฒœ (SHA1, SHA256 โ€ฆ)


Avoid too short key

key ์‚ฌ์ด์ฆˆ๊ฐ€ ํฌ์ง€ ์•Š๋Š”๋ฐ ์˜๋ฏธ ํŒŒ์•…์ด ์–ด๋ ค์šธ ์ •๋„๋กœ ์ถ•์•ฝํ•œ ๊ฒฝ์šฐ(20๊ธ€์ž -> 5๊ธ€์ž), ๋น„์šฉ๋ฉด์—์„œ ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ์—†๊ณ , ๊ฐœ๋ฐœ ์šด์˜ ๊ณผ์ •์—์„œ ๋ฒ„๊ทธ๋‚˜ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ.


Try to stick with schema

ํ‚ค์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด, schema๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

ํ‚ค์˜ ๋‚ด์šฉ๊ณผ ์˜๋ฏธ๊ฐ€ ์ผ์น˜ํ•˜๊ณ , ๋น„๊ต์—ฐ์‚ฐ์—์„œ๋„ ๊ฐ™์€ ์ž๋ฆฌ๋ฅผ ๋น„๊ตํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋น„์šฉ ํšจ์œจ์ ์ด๋‹ค.


Redis์˜ ์ž๋ฃŒํ˜•์‹

Strings

text ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋– ํ•œ object๋‚˜ binary๋ฅผ bytes ํ˜•ํƒœ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•œ๋‹ค.(์ตœ๋Œ€ 512MB)


๋ช…๋ น์–ด

SET & GET

์ง€์ •ํ•œ key์— ์›ํ•˜๋Š” value๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ธฐ๋ณธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

127.0.0.1:6379> SET mykey "myvalue"
OK
127.0.0.1:6379> GET mykey
"myvalue"

๋‹ค์Œ์€ SET์˜ ์˜ต์…˜๋“ค ์ค‘ ๋ช‡๊ฐ€์ง€๋งŒ ์‹ค์Šต๊ณผ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž.

  • EX : ์ง€์ •ํ•œ ์‹œ๊ฐ„(์ดˆ) ํ›„ expire

  • PX : ์ง€์ •ํ•œ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ) ํ›„ expire

    127.0.0.1:6379> set mykey "myvalue" EX 10
    OK
    127.0.0.1:6379> GET mykey
    "myvalue"
    127.0.0.1:6379> GET mykey  # 10์ดˆ ๋’ค
    (nil)
      
    127.0.0.1:6379> SET mykey "myvalue" PX 10000
    OK
    127.0.0.1:6379> GET mykey
    "myvalue"
    127.0.0.1:6379> GET mykey  # 10์ดˆ ๋’ค
    (nil)
    
  • GET : GET์„ ๋งˆ์ง€๋ง‰์— ์‚ฌ์šฉํ•˜๋ฉด SET ํ•˜๊ธฐ ์ด์ „์˜ string์„ ๋ฆฌํ„ดํ•˜๋ฉฐ SET. ์ด์ „ ๊ฐ’์ด string์ด ์•„๋‹ˆ๋ฉด SET์„ ์ทจ์†Œํ•จ

    127.0.0.1:6379> SET mykey value3 GET
    "value2"
    127.0.0.1:6379> GET mykey
    "value3"
    
  • XX : key๊ฐ€ ์กด์žฌํ•˜๋ฉด SET (SET key if exist)

    127.0.0.1:6379> SET mykey value
    OK
    127.0.0.1:6379> GET mykey
    "value"
    127.0.0.1:6379> SET mykey value2 XX  # ๊ธฐ์กด์— mykey๋ผ๋Š” key๊ฐ€ ์กด์žฌ
    OK
    127.0.0.1:6379> GET mykey
    "value2"
    127.0.0.1:6379> SET mykey2 value XX  # ๊ธฐ์กด์— mykey2๋ผ๋Š” key๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
    (nil)
    127.0.0.1:6379> GET mykey2
    (nil)
    
  • NX : key๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด SET (SET key if not exist)

    127.0.0.1:6379> GET mykey
    "value3"
    127.0.0.1:6379> SET mykey value4 NX  # ๊ธฐ์กด์— mykey๋ผ๋Š” key๊ฐ€ ์กด์žฌ
    (nil)
    127.0.0.1:6379> GET mykey
    "value3"
    127.0.0.1:6379> SET mykey2 value NX  # ๊ธฐ์กด์— mykey2๋ผ๋Š” key๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
    OK
    127.0.0.1:6379> GET mykey2
    "value"
    
    SETNX์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ1 : Lock

    3๊ฐœ์˜ ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ๋œ App์ด ์žˆ๋‹ค. ๊ฐ ์„œ๋ฒ„๊ฐ€ jar ํŒŒ์ผ์— ๋Œ€ํ•˜์—ฌ ๊ถŒํ•œ์„ ๊ฐ€์ ธ์•ผ ํ•  ๊ฒฝ์šฐ redis์˜ SETNX๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 1๋ฒˆ ์„œ๋ฒ„๊ฐ€ redis์— SETNX๋ฅผ ๋‚ ๋ ค key๊ฐ€ lock, value๊ฐ€ 1์ด๋ผ๋Š” ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ์ด๋ฏธ lock์ด๋ผ๋Š” ํ‚ค๊ฐ€ ์žˆ์œผ๋‹ˆ ๋‹ค๋ฅธ ์„œ๋ฒ„๋Š” 1์„ ๋ฆฌํ„ด๋ฐ›์ง€ ๋ชปํ•ด ๊ถŒํ•œ ํš๋“์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

    setnx1

    1๋ฒˆ ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น jar ๊ด€๋ จ ์ž‘์—…์ด ๋๋‚˜ ๊ถŒํ•œ์„ ๋ฐ˜๋‚ฉํ•˜๊ธฐ ์œ„ํ•ด lock key๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ์„œ๋ฒ„๋“ค ์ค‘ ํ•œ ์„œ๋ฒ„์˜ SETNX ๋ช…๋ น์ด ์„ฑ๊ณตํ•˜๋ฉฐ 1์„ ๋ฆฌํ„ด ๋ฐ›์•„ ๊ถŒํ•œ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

    setnx2


    SETNX์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ2 : ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ Deduplication์„ ์ ์€ ๋น„์šฉ์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

    ์‚ฌ์šฉ์ž์˜ ์ค‘๋ณต ์‹คํ–‰ ํ˜น์€ ๋„คํŠธ์›Œํฌ์˜ ๋ฌธ์ œ๋กœ ํ•œ ์š”์ฒญ์— ๋ฐ์ดํ„ฐ์— ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋“ค์–ด์™”์„ ๋•Œ์—๋„ SETNX๋ฅผ ํ†ตํ•˜์—ฌ ์ค‘๋ณต๋ฐฉ์ง€๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    1๋ฒˆ ์„œ๋ฒ„์—์„œ key๋กœ ์‚ฌ์šฉ์žID, value๋กœ 1์„ SETNX๋กœ ์ €์žฅํ•œ๋‹ค. ํ›„์— ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ๋™์ผ ์‚ฌ์šฉ์žID๋กœ ์ค‘๋ณต ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” 0์„ ๋ฆฌํ„ดํ•˜์—ฌ ์ด๋ฏธ ๋“ฑ๋ก๋˜์—ˆ์Œ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

    ์—ฌ๊ธฐ์„œ ํ•ด๋‹น ์‚ฌ์šฉ์žID์— ๋Œ€ํ•˜์—ฌ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ผ์ด ์ƒ๊ธฐ๋ฉด EX์™€ ๊ฐ™์€ ์ง€์ •ํ•œ ์‹œ๊ฐ„ ํ›„ ํ•ด๋‹น key๋ฅผ EXPIRE ํ•˜๋Š” ์˜ต์…˜ ๋˜ํ•œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


    ๋งŒ์ผ SETNX๊ฐ€ ์•„๋‹Œ SET, GET์„ ๋”ฐ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด SET ์ˆ˜ํ–‰ ํ›„ GET์œผ๋กœ ๋ฆฌํ„ด๋ฐ›๋Š” ๋„์ค‘ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋จผ์ € ๊ถŒํ•œ ํš๋“์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— SETNX๋กœ ํ•œ๋ฒˆ์— ์ˆ˜ํ–‰ํ•˜์—ฌ ํ•ด๋‹น ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • MSET & MGET : ํ‚ค์™€ ๊ฐ’์„ ์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

    127.0.0.1:6379> MSET mykey1 value1 mykey2 value2
    OK
    127.0.0.1:6379> MGET mykey1 mykey2
    1) "value1"
    2) "value2"
    


Counter Commands

์ง€์ •๋œ key์— ๋Œ€ํ•ด ์ˆซ์ž๋ฅผ atomic ํ•˜๊ฒŒ ์ฆ๊ฐ€/๊ฐ์†Œ ์‹œํ‚ค๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ตํ•œ๋‹ค. ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ ๋ง์…ˆ ๋บ„์…ˆ ์—ฐ์‚ฐ์„ lock free๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๋งŽ์ด ์“ฐ์ธ๋‹ค.

  • INCR : ์ง€์ •ํ•œ key์˜ value๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  • INCRBY : ์ง€์ •ํ•œ key์˜ value๋ฅผ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ˆซ์ž๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  • INCRBYFLOAT : ์ง€์ •ํ•œ key์˜ value๋ฅผ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์†Œ์ˆซ์ ๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    127.0.0.1:6379> SET counter 0
    OK
    127.0.0.1:6379> GET counter
    "0"
    127.0.0.1:6379> INCR counter
    (integer) 1
    127.0.0.1:6379> GET counter
    "1"
    127.0.0.1:6379> INCR counter
    (integer) 2
    127.0.0.1:6379> GET counter
    "2"
    127.0.0.1:6379> INCRBY counter 3
    (integer) 5
    127.0.0.1:6379> GET counter
    "5"
    127.0.0.1:6379> INCRBY counter -3
    (integer) 2
    127.0.0.1:6379> GET counter
    "2"
    127.0.0.1:6379> INCRBYFLOAT counter -0.3
    "1.7"
    

์ถ”๊ฐ€์ ์ธ Redis์— ๋Œ€ํ•œ ์ •๋ณด๋Š” Redis ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

Tags:

Categories:

Updated:

Leave a comment