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์ ๋ฆฌํด๋ฐ์ง ๋ชปํด ๊ถํ ํ๋์ ํ์ง ๋ชปํ๋ค.
1๋ฒ ์๋ฒ๊ฐ ํด๋น jar ๊ด๋ จ ์์ ์ด ๋๋ ๊ถํ์ ๋ฐ๋ฉํ๊ธฐ ์ํด lock key๋ฅผ ์ญ์ ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ์๋ฒ๋ค ์ค ํ ์๋ฒ์ SETNX ๋ช ๋ น์ด ์ฑ๊ณตํ๋ฉฐ 1์ ๋ฆฌํด ๋ฐ์ ๊ถํ์ ํ๋ํ ์ ์๋ค.
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 ๊ณต์ ํํ์ด์ง๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
Leave a comment