[REDIS] ๐ ์๋ฃ๊ตฌ์กฐ ๋ช ๋ น์ด ์ข ๋ฅ & ํ์ฉ ์ฌ๋ก ๐ฏ ์ด์ ๋ฆฌ
Redis ๋ฐ์ดํฐ ํ์ (Collection)
Redis์ ์ฅ์ ์ค ํ๋๋ Key-Value ์คํ ๋ฆฌ์ง์์ Value๋ ๋จ์ํ Object๊ฐ ์๋๋ผ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
String, Set, Sorted Set, Hash, List ๋ฑ ๋ค์ํ ํ์ ์ ์ง์ํ๋ค.
์ด๋ฒ ์๊ฐ์๋ ๊ฐ ๋ ๋์ค์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์๋ณด๊ณ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๋ช ๋ น์ด(command)๋ฅผ ์ ๋ฆฌํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๊ฒ๋ค.
Redis Collections ๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์
ํ๋์ ์ปฌ๋ ์ ์ ๋๋ฌด ๋ง์ ์์ดํ ์ ๋ด์ผ๋ฉด ์ข์ง ์๋ค.
๊ฐ๋ฅํ๋ฉด 10000๊ฐ ์ดํ์, ๋ช์ฒ๊ฐ ์์ค์ ๋ฐ์ดํฐ ์ ์ ์ ์งํ๋๊ฒ Redis ์ฑ๋ฅ์ ์ํฅ์ฃผ์ง ์๋๋ค.
Redis - Strings
- ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด
- ๊ฐ์ ์ต๋ 512 MB์ด๋ฉฐ, String์ผ๋ก ๋ ์ ์๋ binary data๋, JPEG ์ด๋ฏธ์ง๋ ์ ์ฅ ๊ฐ๋ฅํ๋ค.
- ๋จ์ ์ฆ๊ฐ ์ฐ์ฐ์ ์ข์
- string-string ๋งคํ์ ์ด์ฉํ์ฌ ์ฐ๊ฒฐ๋๋ ์๋ฃ ๋งคํ์ ํ ์๋ ์๋ค. HTML ๋งคํ๋ ๊ฐ๋ฅ
Strings ๋ช ๋ น์ด ๋ฆฌ์คํธ
- SET: SET, SETNX, SETEX, SETPEX, MSET, MSETNX, APPEND, SETRANGE
- GET: GET, MGET, GETRANGE, STRLEN
- INCR: INCR, DECR, INCRBY, DECRBY, INCRBYFLOAT
- Enterprise: SETS, DELS, APPENDS (subquery)
Commands | Syntax | Description |
DECR | key | 1์ฉ ๊ฐ๊ฐ, ์ ๊ท์ด๋ฉด -1๋ก setting. |
DECRBY | key decrement | decrement๋งํผ ๊ฐ์. ์ ๊ท์ด๋ฉด -decrement๋ก setting. |
DEL | key [key ...] | ๋ฐ์ดํฐ๋ฅผ ์ญ์ |
GET | key | ๋ฐ์ดํฐ๋ฅผ ์กฐํ |
GETSET | key value | ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ |
INCR | key | 1์ฉ ์ฆ๊ฐ, ์ ๊ท์ด๋ฉด 1๋ก setting. |
INCRBY | key increment | increment๋งํผ ์ฆ๊ฐ. ์ ๊ท์ด๋ฉด increment๋ก setting. |
MGET | key [key ...] | ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์กฐํ |
SET | key value [EX seconds] [PX milliseconds] [NX|XX] |
๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, key๊ฐ ์ด๋ฏธ ์์ผ๋ฉด ๋ฎ์ด์ด๋ค. |
SETNX | key value | ์ง์ ํ key๊ฐ ์์ ๊ฒฝ์ฐ์๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ |
MSET | key value [key value ...] | ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ ์ฅ |
MSETNX | key value [key value ...] | ์ง์ ํ key๊ฐ ์์ ๊ฒฝ์ฐ์๋ง, ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ ์ฅ |
APPEND | key value | ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ์ง์ ํ key๊ฐ ์์ผ๋ฉด ์ ์ฅ |
SETEX | key seconds value | ์ง์ ํ ์๊ฐ(์ด) ์ดํ์ ๋ฐ์ดํฐ ์๋ ์ญ์ |
SETRANGE | key offset value | ์ง์ ํ ์์น(offset)๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฒน์ณ์ด๋ค |
STRLEN | key | ๋ฐ์ดํฐ์ ๋ฐ์ดํธ์๋ฅผ ๋ฆฌํด |
GETRANGE | key start end | ๋ฐ์ดํฐ์ ์ผ๋ถ ๋ฌธ์์ด์ ์กฐํ |
INCRBYFLOAT | key increment | ์ค์์ฐ์ฐ, increment๋งํผ ์ฆ๊ฐ. ์ ๊ท์ด๋ฉด increment๋ก setting. |
PSETEX | key milliseconds value | ์ง์ ํ ์๊ฐ(๋ฐ๋ฆฌ์ด) ์ดํ์ ๋ฐ์ดํฐ ์๋ ์ญ์ |
STRALGO | STRALGO LCS | ๋ ๋ฌธ์์ด์ด ์ผ๋ง๋ ์ ์ฌํ์ง ํ๊ฐ |
GETEX | key [EX seconds] | ๋ฐ์ดํฐ ์กฐํ์ ๋ง๋ฃ ์๊ฐ ์ค์ |
GETDEL | key | ๋ฐ์ดํฐ ์กฐํ์ ์ญ์ |
SETS | key (subquery) | SETS key (subquery) |
DELS | (subquery) | DELS (subquery) |
APPENDS | (subquery) | APPENDS key (subquery) |
# ํ๊ฐ ์กฐํ
set <key> <value>
get <key> <value>
# ์ฌ๋ฌ๊ฐ ์กฐํ
mset <key> <value> <key> <value> ...
mget <key> <key> <key> ...
127.0.0.1:6379> set hello "world!"
OK
127.0.0.1:6379> get hello
"world!"
127.0.0.1:6379> get count
"-351"
127.0.0.1:6379> set count 50
OK
127.0.0.1:6379> incr count
(integer) 51
127.0.0.1:6379> get count
"51"
127.0.0.1:6379> incrby count 100
(integer) 151
127.0.0.1:6379> decr count
(integer) 150
127.0.0.1:6379> decrby count 500
(integer) -350
127.0.0.1:6379> mset a "hello" b "world"
OK
127.0.0.1:6379> mget a b
1) "hello"
2) "world"
Redis - Bitmaps
- bitmaps์ string์ ๋ณํ
- bit ๋จ์ ์ฐ์ฐ ๊ฐ๋ฅํ๋ค.
- String์ด 512MB ์ ์ฅ ํ ์ ์๋ฏ์ด 2^32 bit๊น์ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ์ ์ฅํ ๋, ์ ์ฅ ๊ณต๊ฐ ์ ์ฝ์ ํฐ ์ฅ์ ์ด ์๋ค.
Bits ๋ช ๋ น์ด ๋ฆฌ์คํธ
Commands | Syntax | Description |
GETBIT | key offset | bit ๊ฐ ์กฐํ |
SETBIT | key offset value | bit ๊ฐ ์กฐ์ |
BITCOUNT | key [start end] | 1์ธ bit ์๋ฅผ ์ผ๋ค |
BITOP | key operation destkey key [key ...] | bit ์ฐ์ฐ( AND, OR, XOR, NOT) ์คํ |
BITPOS | key bit [start [end]] | ์ง์ ํ bit์ ์์น๋ฅผ ๊ตฌํ๋ค |
BITFIELD | key [GET type offset] [SET type offset value] | Perform arbitrary bitfield integer operations on strings |
# setbit <key> <offset> <value>
# key: ํด๋น ๋นํธ๋งต์ ์นญํ ๊ฐ
# offset: 0 ๋ณด๋ค ํฐ ์ ์์ ๊ฐ
# value: 0 ๋๋ 1์ ๋นํธ ๊ฐ
> setbit 20220410 4885 1
> getbit 20220410 4885
> bitcount 20220410 # ๋ฒ์ ๋ด์ 1๋ก ์ค์ ๋ bit์ ๊ฐ์๋ฅผ ๋ฐํ
Redis - Lists
- array ํ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ. ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ์ ์ฅ
- ์ถ๊ฐ / ์ญ์ / ์กฐํํ๋ ๊ฒ์ O(1)์ ์๋๋ฅผ ๊ฐ์ง์ง๋ง, ์ค๊ฐ์ ํน์ index ๊ฐ์ ์กฐํํ ๋๋ O(N)์ ์๋๋ฅผ ๊ฐ์ง๋ ๋จ์ ์ด ์๋ค.
- ์ฆ, ์ค๊ฐ์ ์ถ๊ฐ/์ญ์ ๊ฐ ๋๋ฆฌ๋ค. ๋ฐ๋ผ์ head-tail์์ ์ถ๊ฐ/์ญ์ ํ๋ค. (push / pop ์ฐ์ฐ)
- ๋ฉ์ธ์ง queue๋ก ์ฌ์ฉํ๊ธฐ ์ ์ ํ๋ค.
์์ ๋คํธ์ํฌ์์ ํ์๋ผ์ธ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ LPUSH๋ฅผ ํตํด ์ ์ผ ์ฒซ ๋ถ๋ถ์ Insertํ๋ฉฐ LRANGE ๋ช ๋ น์ด๋ฅผ ํตํด ์ผ์ ํฌ๊ธฐ๋ฅผ ๊ณ ์ ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ๋ฐํํ ์ ์๋ค.
LPUSH ๋ช ๋ น์ด์ LTRIM ๋ช ๋ น์ด๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด Lists์ ํฌ๊ธฐ๋ฅผ ํญ์ ์ผ์ ํ๊ฒ ๊ณ ์ ์ํฌ ์ ์๋ค.
LPUSH์ RPOP์ ์ด์ฉํ๋ค๋ฉด message๋ฅผ ์ ๋ฌํ๋ queue๋ก ์ฌ์ฉํ ์ ์๋ค.
Lists ๋ช ๋ น์ด ๋ฆฌ์คํธ
- SET (PUSH): LPUSH, RPUSH, LPUSHX, RPUSHX, LSET, LINSERT, RPOPLPUSH
- GET: LRANGE, LINDEX, LLEN
- POP: LPOP, RPOP, BLPOP, BRPOP
- REM: LREM, LTRIM
- BLOCK: BLPOP, BRPOP, BRPOPLPUSH
- Enterprise: LREVRANGE, LPUSHS, RPUSHS (subquery)
Commands | Syntax | Description |
LPUSH | key value [value ...] | ์ผ์ชฝ์์ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ |
RPOP | key | ๋ฆฌ์คํธ ์ค๋ฅธ์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ค๊ณ , ๋ฆฌ์คํธ์์๋ ์ญ์ |
LPOP | key | ๋ฆฌ์คํธ ์ผ์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ค๊ณ , ๋ฆฌ์คํธ์์๋ ์ญ์ |
RPUSH | key value [value ...] | ์ค๋ฅธ์ชฝ์์ ๋ฆฌ์คํธ์ ์ผ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ |
LRANGE | key start stop | ์ธ๋ฑ์ค๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ๋ฆฌ์คํธ ์กฐํ |
LLEN | key | ๋ฆฌ์คํธ์์ ๋ฐ์ดํฐ์ ์ด ๊ฐฏ์๋ฅผ ์กฐํ |
LINDEX | key index | ์ธ๋ฑ์ค๋ก ํน์ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ |
LSET | key index value | ์ธ๋ฑ์ค๋ก ํน์ ์์น์ ๊ฐ์ ๋ฐ๊ฟ |
LREM | key count value | ๊ฐ์ ์ง์ ํด์ ์ญ์ |
LTRIM | key start stop | ์ธ๋ฑ์ค๋ก ์ง์ ํ ๋ฒ์ ๋ฐ์ ๊ฐ๋ค์ ์ญ์ |
RPOPLPUSH | key src_key dest_key | RPOP + LPUSH |
BLPOP | key [key ...] timeout | ๋ฆฌ์คํธ์ ๊ฐ์ด ์์ ๊ฒฝ์ฐ, ์ง์ ํ ์๊ฐ๋งํผ ๊ธฐ๋ค๋ ค์ ๊ฐ์ด ๋ค์ด์ค๋ฉด LPOP ์คํ |
BRPOP | key [key ...] timeout | ๋ฆฌ์คํธ์ ๊ฐ์ด ์์ ๊ฒฝ์ฐ, ์ง์ ํ ์๊ฐ๋งํผ ๊ธฐ๋ค๋ ค์ ๊ฐ์ด ๋ค์ด์ค๋ฉด RPOP ์คํ |
BRPOPLPUSH | src_key dest_key timeout | ๋ฆฌ์คํธ์ ๊ฐ์ด ์์ ๊ฒฝ์ฐ, ์ง์ ํ ์๊ฐ๋งํผ ๊ธฐ๋ค๋ ค์ ๊ฐ์ด ๋ค์ด์ค๋ฉด RPOPLPUSH ์คํ |
LINSERT | key BEFORE|AFTER pivot value | ์ง์ ํ ๊ฐ ์/๋ค์ ์ ๊ฐ ์ ์ฅ |
LPUSHX | key value | ๊ธฐ์กด์ ๋ฆฌ์คํธ๊ฐ ์์ ๊ฒฝ์ฐ์๋ง LPUSH ์คํ |
RPUSHX | key value | ๊ธฐ์กด์ ๋ฆฌ์คํธ๊ฐ ์์ ๊ฒฝ์ฐ์๋ง RPUSH ์คํ |
LPOS | key element | ๊ฐ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์กฐํ |
LMOVE | source destination | ๋ฆฌ์คํธ๊ฐ ๋ฐ์ดํฐ ์ด๋ |
BLMOVE | source destination | ๋ฆฌ์คํธ๊ฐ ๋ฐ์ดํฐ ์ด๋ - ๋๊ธฐ |
LLS | key pattern | ํจํด(pattern)์ผ๋ก ๊ฐ(value) ์กฐํ |
LRM | key pattern | ํจํด(pattern)์ผ๋ก ๊ฐ(value) ์ญ์ |
LREVRANGE | key key start stop | ์ธ๋ฑ์ค๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ์ญ์์ผ๋ก ์กฐํ |
LPUSHS | key (subquery) | ์๋ธ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ |
RPUSHS | key (subquery) | ์๋ธ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ |
# ์ผ์ชฝ์ ์ฝ์
lpush <key> <value>
# ์ค๋ฅธ์ชฝ์ ์ฝ์
rpush <key> <value>
# ์ญ์
lpop <key>
rpop <key>
# LPUSH๋ฅผ ํตํ list ์์ฑ
127.0.0.1:6379> LPUSH myList "a"
(integer) 1
127.0.0.1:6379> LRANGE myList 0 -1
1) "a"
# LPUSH , RPUSH๋ฅผ ํตํ ์์ ์ฝ์
๊ฒฐ๊ณผ.
127.0.0.1:6379> LPUSH myList "b"
(integer) 2
127.0.0.1:6379> RPUSH myList "c"
(integer) 3
127.0.0.1:6379> LRANGE myList 0 -1
1) "b"
2) "a"
3) "c"
# LPUSHX , RPUSHX ์ฌ์ฉ ์
# key๊ฐ ์๋๊ณณ์ ์ถ๊ฐํ ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ 0์ ๋ฐํ.
127.0.0.1:6379> LPUSHX myList2 "a"
(integer) 0
127.0.0.1:6379> LPUSH myList "d"
(integer) 4
# ๊ธฐ์กด์ ์๋ myList์์๋ค์ [ d , b , a , c ] ์์ผ๋ก ๋์ด์์.
# LPOP , RPOP์ ํตํด ๋งจ ์ข ์ฐ์ธก ์์ ํ๊ฐ์ฉ ์ ๊ฑฐ
127.0.0.1:6379> LPOP myList
"d"
127.0.0.1:6379> RPOP myList
"c"
127.0.0.1:6379> LRANGE myList 0 -1
1) "b"
2) "a"
# ํ์ฌ List์ ์์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅ.
127.0.0.1:6379> LLEN myList
(integer) 2
# LREM์ ํตํธ ํด๋น ์์ ์ญ์ , count๋ฅผ 0 ์ผ๋ก ํด์ ์์์ค์ "a"๋ ๋งค์นญ๋๋ ๊ฐ์ ์ญ์
127.0.0.1:6379> LREM myList 0 "a"
(integer) 1
127.0.0.1:6379> LRANGE myList 0 -1
1) "b"
# ํด๋น key์ ํด๋น๋๋ index๊ฐ์ ์
๋ ฅ๋ฐ์ ๊ฐ์ ์์ .
# ํ์ฌ b๋ก ๋จ์์๋ ์์๊ฐ์ z๋ก ๋ณ๊ฒฝ
127.0.0.1:6379> LSET myList 0 "z"
OK
127.0.0.1:6379> LRANGE myList 0 -1
1) "z"
# RPOPLPUSH
127.0.0.1:6379> RPOPLPUSH myList hello
"z"
127.0.0.1:6379> LRANGE hello 0 -1
1) "z"
Redis - Hashes
- field-value๋ก ๊ตฌ์ฑ ๋์ด์๋ ์ ํ์ ์ธ hash์ ํํ (ํ์ด์ฌ์ ๋์ ๋๋ฆฌ๋ js๊ฐ์ฒด ์ ๋๋ก ์ดํดํ๋ฉด ๋๋ค)
- key ํ์์ subkey๋ฅผ ์ด์ฉํด ์ถ๊ฐ์ ์ธ Hash Table์ ์ ๊ณตํ๋ ์๋ฃ๊ตฌ์กฐ
- ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ฉํ๋ ํ, ์ ํ์์ด field๋ค์ ๋ฃ์ ์๊ฐ ์๋ค.
Hashes ๋ช ๋ น์ด ๋ฆฌ์คํธ
- SET: HSET, HMSET, HSETNX
- GET: HGET, HMGET, HLEN, HKEYS, HVALS, HGETALL, HSTRLEN, HSCAN, HEXISTS
- REM: HDEL
- INCR: HINCRBY, HINCRBYFLOAT
Commands | Syntax | Description |
HSET | key field value | Field์ value๋ฅผ ์ ์ฅ |
HDEL | key field [field ...] | Field๋ก value๋ฅผ ์ญ์ |
HGET | key field | Field๋ก value๋ฅผ ์กฐํ |
HLEN | key | Field ๊ฐฏ์ ์กฐํ |
HMSET | key field value [field value ...] | ์ฌ๋ฌ๊ฐ์ field์ value๋ฅผ ์ ์ฅ |
HMGET | key field [field ...] | ์ฌ๋ฌ๊ฐ์ value๋ฅผ ์กฐํ |
HKEYS | key | Key์ ์ํ ๋ชจ๋ field name์ ์กฐํ |
HVALS | key | Key์ ์ํ ๋ชจ๋ value๋ฅผ ์กฐํ |
HGETALL | key | Key์ ์ํ ๋ชจ๋ field์ value์ ์กฐํ |
HINCRBY | key field increment | value๋ฅผ increment ๋งํผ ์ฆ๊ฐ ๋๋ ๊ฐ์ |
HEXISTS | key field | Field๊ฐ ์๋์ง ํ์ธ |
HSETNX | key field value | Field๊ฐ ๊ธฐ์กด์ ์์ผ๋ฉด ์ ์ฅ |
HINCRBYFLOAT | key field increment_float | value๋ฅผ increment_float ๋งํผ ์ฆ๊ฐ ๋๋ ๊ฐ์ |
HSCAN | key cursor [MATCH pattern] [COUNT count] |
Field, member๋ฅผ ์ผ์ ๋จ์ ๊ฐฏ์ ๋งํผ์ฉ ์กฐํ |
HSTRLEN | key field | value์ ๊ธธ์ด(byte)๋ฅผ ์กฐํ |
# ํ๊ฐ ๊ฐ ์ฝ์
๋ฐ ์ญ์
hset <key> <subkey> <value>
hget <key> <subkey>
# ์ฌ๋ฌ ๊ฐ ์ฝ์
๋ฐ ์ญ์
hmset <key> <subkey> <value> <subkey> <value> ...
hnget <key> <subkey> <subkey> <subkey> ...
# ๋ชจ๋ subkey์ value ๊ฐ์ ธ์ค๊ธฐ, Collection์ ๋๋ฌด ๋ง์ key๊ฐ ์์ผ๋ฉด ์ฅ์ ์ ์์ธ์ด ๋จ
hgetall <key>
# ๋ชจ๋ value๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
hvlas <key>
# field - value : name - jinmin / year - 1995 / month - 3
127.0.0.1:6379> hset hh name jinmin year 1995 month 3
(integer) 3
127.0.0.1:6379> hget hh name
"jinmin"
127.0.0.1:6379> hget hh year
"1995"
127.0.0.1:6379> hdel hh year
(integer) 1
127.0.0.1:6379> hlen hh
(integer) 2
127.0.0.1:6379> hgetAll hh
1) "name"
2) "jinmin"
3) "month"
4) "3"
127.0.0.1:6379> hkeys hh
1) "name"
2) "month"
127.0.0.1:6379> hvals hh
1) "jinmin"
2) "3"
Redis - Sets
- ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ง ์๊ธฐ ์ํด ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ (js์ set์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค)
- ์ ๋ํฌํ key๊ฐ
- ์ ๋ ฌ๋์ง ์์ ์งํฉ
- ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์ฅํ๋ฉด ์ต์ข ํ๋ฒ๋ง ์ ์ฅ๋๋ค.
- Set๊ฐ์ ์ฐ์ฐ์ ์ง์. ๊ต์งํฉ, ํฉ์งํฉ, ์ฐจ์ด๋ฅผ ๋งค์ฐ ๋น ๋ฅธ ์๊ฐ๋ด์ ์ถ์ถํ ์ ์๋ค.
- ๋จ, ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ๋ค ๊ฐ๊ณ ์ฌ ์ ์๋ ๋ช ๋ น์ด ์์ผ๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
Sets ๋ช ๋ น์ด ๋ฆฌ์คํธ
- SET: SADD, SMOVE
- GET: SMEMBERS, SCARD, SRANDMEMBER, SISMEMBER, SSCAN
- POP: SPOP
- REM: SREM
- ์งํฉ์ฐ์ฐ: SUNION, SINTER, SDIFF, SUNIONSTORE, SINTERSTORE, SDIFFSTORE
- Enterprise: SLS, SRM, SLEN, SADDS (subquery)
Commands | Syntax | Description |
SADD | key member [member ...] | ์งํฉ์ member๋ฅผ ์ถ๊ฐ |
SREM | key member [member ...] | ์งํฉ์์ member๋ฅผ ์ญ์ |
SMEMBERS | key | ์งํฉ์ ๋ชจ๋ member๋ฅผ ์กฐํ |
SCARD | key | ์งํฉ์ ์ํ member์ ๊ฐฏ์๋ฅผ ์กฐํ |
SUNION | key [key ...] | ํฉ์งํฉ์ ๊ตฌํจ |
SINTER | key [key ...] | ๊ต์งํฉ์ ๊ตฌํจ |
SDIFF | key [key ...] | ์ฐจ์งํฉ์ ๊ตฌํจ |
SUNIONSTORE | dest_key src_key [src_key ...] | ํฉ์งํฉ์ ๊ตฌํด์ ์๋ก์ด ์งํฉ์ ์ ์ฅ |
SINTERSTORE | dest_key src_key [src_key ...] | ๊ต์งํฉ์ ๊ตฌํด์ ์๋ก์ด ์งํฉ์ ์ ์ฅ |
SDIFFSTORE | dest_key src_key [src_key ...] | ์ฐจ์งํฉ์ ๊ตฌํด์ ์๋ก์ด ์งํฉ์ ์ ์ฅ |
SISMEMBER | key member | ์งํฉ์ member๊ฐ ์กด์ฌํ๋์ง ํ์ธ |
SMOVE | src_key dest_key member | ์์ค ์งํฉ์ member๋ฅผ ๋ชฉ์ ์งํฉ์ผ๋ก ์ด๋ |
SPOP | key [count] | ์งํฉ์์ ๋ฌด์์๋ก member๋ฅผ ๊ฐ์ ธ์ด |
SRANDMEMBER | key [count] | ์งํฉ์์ ๋ฌด์์๋ก member๋ฅผ ์กฐํ |
SSCAN | key cursor [MATCH pattern] [COUNT count] |
member๋ฅผ ์ผ์ ๋จ์ ๊ฐฏ์ ๋งํผ์ฉ ์กฐํ |
SMISMEMBER | key member [member ...] | ์งํฉ์ member๊ฐ ์กด์ฌํ๋์ง ํ์ธ - ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ |
SLS | key pattern | ํจํด(pattern)์ผ๋ก ๊ฐ(value) ์กฐํ |
SRM | key pattern | ํจํด(pattern)์ผ๋ก ๊ฐ(value) ์ญ์ |
SLEN | key | ํค์ ์ํ ๋ฉค๋ฒ ๊ฐ์๋ฅผ ๋ฆฌํด |
SADDS | key (subquery) | ์๋ธ์ฟผ๋ฆฌ๋ก member๋ฅผ ์ถ๊ฐ |
sadd <key> <item>
# ์กด์ฌ ์ฌ๋ถ๋ฅผ ์ฒดํฌ, ์์ผ๋ฉด 1 ์์ผ๋ฉด 0 ๋ฐํ
sismember <key> <item>
# ์ญ์
srem <key> <value>
# key์ ๋ชจ๋ item ์กฐํ
smembers <key>
127.0.0.1:6379> sadd myset a # ์ถ๊ฐ๋ member ๊ฐฏ์ ๋ฐํ
(integer) 1
127.0.0.1:6379> sadd myset a
(integer) 0
127.0.0.1:6379> sadd myset b
(integer) 1
127.0.0.1:6379> sadd myset c
(integer) 1
127.0.0.1:6379> srem myset c # ์ญ์ ๋ member ๊ฐฏ์ ๋ฐํ
(integer) 1
127.0.0.1:6379> smembers myset
1) "b"
2) "a"
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> sadd myset c d e f # ์ฌ๋ฌ member ์ฝ์
๊ฐ๋ฅ
(integer) 4
127.0.0.1:6379> smembers myset
1) "d"
2) "c"
3) "a"
4) "f"
5) "b"
6) "e"
127.0.0.1:6379> spop myset 3 # ๋๋ค member ์ญ์
1) "d"
2) "c"
3) "f"
127.0.0.1:6379> smembers myset
1) "a"
2) "b"
3) "e"
Redis - Sorted Sets
- set์ score๋ผ๋ ํ๋๊ฐ ์ถ๊ฐ๋ ๋ฐ์ดํฐ ํ (score๋ ์ผ์ข ์ ๊ฐ์ค์น)
- ์ผ๋ฐ์ ์ผ๋ก set์ ์ ๋ ฌ์ด ๋์ด์์ง์๊ณ insert ํ ์์๋๋ก ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฌ๋ Sorted Set์ Set์ ํน์ฑ์ ๊ทธ๋๋ก ๊ฐ์ง๋ฉฐ ์ถ๊ฐ์ ์ผ๋ก ์ ์ฅ๋ member๋ค์ ์์๋ ๊ด๋ฆฌํ๋ค. - ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋๋ถํฐ score ์์ผ๋ก ์ ๋ ฌ๋๋ฉฐ ์ ์ฅ
- sorted set์์ ๋ฐ์ดํฐ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ด๋ถ ์ ๋ ฌ
- value๋ ์ค๋ณต ๋ถ๊ฐ๋ฅ, score๋ ์ค๋ณต ๊ฐ๋ฅ
- ๋ง์ฝ score ๊ฐ์ด ๊ฐ์ผ๋ฉด ์ฌ์ ์์ผ๋ก ์ ๋ ฌ๋์ด ์ ์ฅ
์ ์ ๋ญํน ๋ณด๋์๋ฒ ๊ฐ์ ๊ตฌํ์์ ์ฌ์ฉํ ์ ์๋ค.
Sorted Sets ๋ช ๋ น์ด ๋ฆฌ์คํธ
- SET: ZADD
- GET: ZRANGE, ZRANGEBYSCORE, ZRANGEBYLEX, ZREVRANGE, ZREVRANGEBYSCORE, ZREVRANGEBYLEX, ZRANK, ZREVRANK, ZSCORE, ZCARD, ZCOUNT, ZLEXCOUNT, ZSCAN
- POP: ZPOPMIN, ZPOPMAX
- REM: ZREM, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZREMRANGEBYLEX
- INCR: ZINCRBY
- ์งํฉ์ฐ์ฐ: ZUNIONSTORE, ZINTERSTORE
- Enterprise: ZISMEMBER, ZLS, ZRM, SLEN, SADDS (subquery)
Commands | Syntax | Description |
ZADD | key score member [score member ...] | ์งํฉ์ score์ member๋ฅผ ์ถ๊ฐ |
ZCARD | key | ์งํฉ์ ์ํ member์ ๊ฐฏ์๋ฅผ ์กฐํ |
ZINCRBY | key increment member | ์ง์ ํ ๋งํผ score ์ฆ๊ฐ, ๊ฐ์ |
ZRANGE | key start stop [withscores] | index๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ์กฐํ |
ZRANGEBYSCORE | key min max [withscores] [limit offset count] |
score๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ์กฐํ |
ZREM | key member [member ...] | ์งํฉ์์ member๋ฅผ ์ญ์ |
ZREMRANGEBYSCORE | key min max | score๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ member๋ฅผ ์ญ์ |
ZREVRANGE | key start stop [withscores] | index๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ํฐ ๊ฒ๋ถํฐ ์กฐํ |
ZSCORE | key member | member๋ฅผ ์ง์ ํด์ score๋ฅผ ์กฐํ |
ZCOUNT | key min max | score๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ๊ฐฏ์ ์กฐํ |
ZRANK | key member | member๋ฅผ ์ง์ ํด์ rank(index)๋ฅผ ์กฐํ |
ZREVRANK | key member | member๋ฅผ ์ง์ ํด์ reverse rank(index)๋ฅผ ์กฐํ |
ZREMRANGEBYRANK | key start stop | index๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ member๋ฅผ ์ญ์ |
ZUNIONSTORE | dest_key numkeys src_key [src_key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] |
ํฉ์งํฉ์ ๊ตฌํด์ ์๋ก์ด ์งํฉ์ ์ ์ฅ |
ZINTERSTORE | dest_key numkeys src_key [src_key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] |
๊ต์งํฉ์ ๊ตฌํด์ ์๋ก์ด ์งํฉ์ ์ ์ฅ |
ZREVRANGEBYSCORE | key max min [withscores] [limit offset count] |
score๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ํฐ ๊ฒ๋ถํฐ ์กฐํ |
ZSCAN | key cursor [MATCH pattern] [COUNT count] |
score, member๋ฅผ ์ผ์ ๋จ์ ๊ฐฏ์ ๋งํผ์ฉ ์กฐํ |
ZRANGEBYLEX | key min max [limit offset count] | member๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ์กฐํ |
ZLEXCOUNT | key min max | member๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ๊ฐฏ์ ์กฐํ |
ZREMRANGEBYLEX | key min max | member๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ member๋ฅผ ์ญ์ |
ZREVRANGEBYLEX | key max min [limit offset count] | member๋ก ๋ฒ์๋ฅผ ์ง์ ํด์ ํฐ ๊ฒ๋ถํฐ ์กฐํ |
ZPOPMIN | key | ์์ ๊ฐ๋ถํฐ ๊บผ๋ด์จ๋ค |
ZPOPMAX | key | ํฐ ๊ฐ๋ถํฐ ๊บผ๋ด์จ๋ค |
BZPOPMIN | key | ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ฉด ์์ ๊ฐ๋ถํฐ ๊บผ๋ด์จ๋ค |
BZPOPMAX | key | ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ฉด ํฐ ๊ฐ๋ถํฐ ๊บผ๋ด์จ๋ค |
ZMSCORE | member [member ...] | member์ score๋ฅผ ๋ฆฌํด - ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ |
ZRANDMEMBER | key | ์์(random)์ ๋ฉค๋ฒ๋ฅผ ์กฐํ |
ZRANGESTORE | dst src start stop | ์กฐํํด์ ๋ค๋ฅธ ํค์ ์ ์ฅ |
ZUNION | numkeys key [key ...] | ํฉ์งํฉ์ ๊ตฌํจ |
ZINTER | numkeys key [key ...] | ๊ต์งํฉ์ ๊ตฌํจ |
ZDIFF | numkeys key [key ...] | ์ฐจ์งํฉ์ ๊ตฌํจ |
ZDIFFSTORE | destination numkeys key [key ...] | ์ฐจ์งํฉ์ ๊ตฌํด์ ์๋ก์ด ์งํฉ์ ์ ์ฅ |
ZISMEMBER | key member | ์งํฉ์ member๊ฐ ์กด์ฌํ๋์ง ํ์ธ |
ZLS | key pattern | ํจํด(pattern)์ผ๋ก ๊ฐ(value) ์กฐํ |
ZRM | key pattern | ํจํด(pattern)์ผ๋ก ๊ฐ(value) ์ญ์ |
ZLEN | key | ํค์ ์ํ ๋ฉค๋ฒ ๊ฐ์๋ฅผ ๋ฆฌํด |
ZADDS | key (subquery) | ์๋ธ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ ์ถ๊ฐ |
# ZADD : key์ score-member๋ฅผ ์ถ๊ฐ
127.0.0.1:6379> zadd fruit 2 apple
(integer) 1
127.0.0.1:6379> zadd fruit 10 banana
(integer) 1
# ๋ณต์๊ฐ์ score-member๋ฅผ ์ถ๊ฐํ ์ ์์
127.0.0.1:6379> zadd fruit 8 melon 4 orange 6 watermelon
(integer) 3
# ์ด๋ฏธ ์ถ๊ฐ ๋ member๋ฅผ add ์ score๊ฐ ์
๋ฐ์ดํธ
127.0.0.1:6379> zadd fruit 15 apple
(integer) 0
# ZSCORE : member์ ํด๋นํ๋ score ๊ฐ ๋ฆฌํด
127.0.0.1:6379> zscore fruit apple
"15"
# ZRANK : member์ ํด๋นํ๋ rank(์์) ๊ฐ ๋ฆฌํด
127.0.0.1:6379> zrank fruit melon
(integer) 2
# ZRANGE : key์ ํด๋นํ๋ start - stop ๋ด๊ฐ ์ถ๋ ฅํ๊ณ ์ถ์ ์์๋ฅผ ์ถ์ถ
127.0.0.1:6379> zrange fruit 0 -1
1) "orange"
2) "watermelon"
3) "melon"
4) "banana"
5) "apple"
Redis - HyperLogLogs
- ๊ต์ฅํ ๋ง์์์ ๋ฐ์ดํฐ๋ฅผ dumpํ ๋ ์ฌ์ฉ
- ์ค๋ณต๋์ง ์๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ countํ ๋ ์ฃผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค. (์ค์ฐจ ๋ฒ์ 0.81%)
- set๊ณผ ๋น์ทํ์ง๋ง ์ ์ฅ๋๋ ์ฉ๋์ ๋งค์ฐ ์๋ค (์ ์ฅ ๋๋ ๋ชจ๋ ๊ฐ์ด 12kb ๊ณ ์ )
- ํ์ง๋ง ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๋ค์ ํ์ธํ ์ ์๋ค. (๋ฐ์ดํฐ ๋ณดํธ์ ์ ์ )
์์ฒญ ํฌ๊ณ ์ ๋ํฌ ํ ๊ฐ ์นด์ดํ ํ ๋ ์ฌ์ฉ
→ ์น ์ฌ์ดํธ ๋ฐฉ๋ฌธ ip ๊ฐ์ ์นด์ดํ , ํ๋ฃจ ์ข ์ผ ํฌ๋กค๋ง ํ url ๊ฐ์ ๋ช๊ฐ ์ธ์ง, ๊ฒ์ ์์ง์์ ๊ฒ์ ํ ๋จ์ด ๋ช๊ฐ ์ธ์ง
HyperLogLog ๋ช ๋ น์ด ๋ฆฌ์คํธ
Commands | Syntax | Description |
PFADD | key ele [ele ...] | ์์(element) ์ถ๊ฐ |
PFCOUNT | key [key ...] | ์์ ๊ฐ์ ์กฐํ |
PFMERGE | destkey sourcekey [sourcekey ...] | ์งํฉ ๋จธ์ง(Merge) |
> PFADD crawled:20171124 "http://www.google.com/"
(integer) 1
> PFADD crawled:20171124 "http://www.redis.com/"
(integer) 1
> PFADD crawled:20171124 "http://www.redis.io/"
(integer) 1
> PFADD crawled:20171125 "http://www.redisearch.io/"
(integer) 1
> PFADD crawled:20171125 "http://www.redis.io/"
(integer) 1
> PFCOUNT crawled:20171124
(integer) 3
> PFMERGE crawled:20171124-25 crawled:20171124 crawled:20171125
OK
> PFCOUNT crawled:20171124-25
(integer) 4
Redis - Streams
- Streams๋ log๋ฅผ ์ ์ฅํ๊ธฐ ๊ฐ์ฅ ์ข์ ์๋ฃ ๊ตฌ์กฐ
- append-only ์ด๋ฉฐ ์ค๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ง ์๋๋ค.
- ์ฝ์ด ์ฌ๋ id๊ฐ ๊ธฐ๋ฐ์ผ๋ก ์๊ฐ ๋ฒ์๋ก ๊ฒ์
- tail -f ์ฌ์ฉ ํ๋ ๊ฒ ์ฒ๋ผ ์ ๊ท ์ถ๊ฐ ๋ฐ์ดํฐ ์์
์๋น์๋ณ ๋ค๋ฅธ ๋ฐ์ดํฐ ์์ (์๋น์ ๊ทธ๋ฃน) ๋ฑ ํ์ฉ ๊ฐ๋ฅํ๋ค.
Streams ๋ช ๋ น์ด ๋ฆฌ์คํธ
Commands | Syntax | Description |
XADD | key ID field string [field string ...] | ๋ฐ์ดํฐ ์ถ๊ฐ |
XLEN | key | |
XRANGE | key start end [COUNT count] | |
XREVRANGE | key end start [COUNT count] | |
XREAD | [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] | ๋ฐ์ดํฐ ์ฝ๊ธฐ |
XDEL | key ID [ID ...] | ๋ฐ์ดํฐ ์ญ์ |
XTRIM | key MAXLEN [~] count | ๋ฐ์ดํฐ ์ฌ๋ฌ๊ฐ ์ญ์ |
XGROUP | [CREATE key group id-or-$] [DESTROY key group] [DELCONSUMER key group consumer] [SETID key group id-or-$] | |
XREADGROUP | GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] | |
XACK | key group ID [ID ...] | |
XPENDING | key group [start end count] [consumer] | |
XCLAIM | key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID] | |
XAUTOCLAIM | key group consumer min-idle-time start [COUNT count] [JUSTID] | |
XINFO | [CONSUMERS key group] [GROUPS key] [STREAM key] [HELP] |
>>> 127.0.0.1:6379> XADD customer * id "asdfdasf"
>>> "1647231099585-0"
>>> 127.0.0.1:6379> XADD customer * id "asdfdasf"
>>> "1647231112587-0"
>>> 127.0.0.1:6379> xlen customer
>>> (integer) 2
>>> 127.0.0.1:6379> xdel customer 1647231396280-0
>>> (integer) 1
XADD ์ปค๋งจ๋๋ฅผ ์ด์ฉํด mystream ์ด๋ผ๋ ํค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
* ๋ฌธ์๋ ์์ด๋๊ฐ์ ์๋ฏธํ๋ฉฐ ์์ด๋๋ฅผ ์ง์ ์ง์ ํ ์๋ ์์ง๋ง, * ๋ฌธ์๋ฅผ ์ ๋ ฅํ๋ฉด redis๊ฐ ์์์ ์ ์ฅํ๊ณ ๋ฐํํด์ค
๋ฐํ๋ ์์ด๋๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์๊ฐ์ ์๋ฏธ
Redis ์๋ฃ๊ตฌ์กฐ ํ์ฉ ์ฌ๋ก
์ฌ๋ก 1 - ์ข์์ ์ฒ๋ฆฌํ๊ธฐ
๊ธฐ๋ณธ์ ์ผ๋ก SNS์์ ๊ฒ์๋ฌผ ์ข์์ ์ฒ๋ฆฌ๋ ํ ์ฌ์ฉ์๊ฐ ํ๋์ ๋๊ธ์ ์ข์์๋ฅผ ํ๋ฒ์ฉ๋ง ํ ์ ์๋ค.
RDBMS์์ ์ ๋ํฌ ์กฐ๊ฑด์ ๊ฑธ์ด์ ๊ตฌํํ ์ ์์ง๋ง, ์ด๋ ๊ฒ insert์ update๊ฐ ์์ฃผ ๋ฐ์ํ๋ ๊ฒฝ์ฐ RDBMS ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ๋ ๋์ค์ Set์ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ๋น ๋ฅธ ์๊ฐ ์์ ์ฒ๋ฆฌํ ์ ์๋ค.
๋๊ธ์ ๋ฒํธ๋ฅผ key๋ก ํ๊ณ , ํด๋น ๋๊ธ์ ์ข์์๋ฅผ ๋๋ฅธ ํ์ ID๋ฅผ ์์ดํ ์ผ๋ก ์ถ๊ฐํ๋ฉด ๋์ผํ ID๊ฐ์ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ํ ๋ช ์ ์ฌ์ฉ์๋ ํ๋์ ๋๊ธ์ ํ๋ฒ ๋ง ์ข์์๋ฅผ ๋๋ฅผ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฌ๋ก 2 - ์ผ์ผ ์ ๋ฐฉ๋ฌธ์์ ๊ตฌํ๊ธฐ
์ ๋ฐฉ๋ฌธ์์ ๋ ์๋น์ค์ ์ฌ์ฉ์๊ฐ ํ๋ฃจ์ ์ฌ๋ฌ๋ฒ ๋ฐฉ๋ฌธํ๋๋ผ๋ ํ๋ฒ๋ง ์นด์ดํ ๋๋ ๊ฐ์ด๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ณต ๋ฐฉ๋ฌธ์ ์ ๊ฑฐํ ๋ฐฉ๋ฌธ์์ ์งํ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ ์ ๋ ์ฒ๋ง ๋ช ์ด๋ผ ๊ฐ์ ํ๊ณ , ์ผ์ผ ๋ฐฉ๋ฌธ์ ํ์๋ฅผ ์ง๊ณํ๋ฉฐ ์ด ๊ฐ์ 0์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๊ธฐํ ๋๋ค๊ณ ํ์.
์ค์ ์๋น์ค์์๋ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์๋ค.
- Google Analytics์ ๊ฐ์ ์ธ๋ถ ์๋น์ค ์ด์ฉ
- access log ๋ถ์
- ์ ์ ์ ๋ณด๋ฅผ ๋ก๊ทธํ์ผ๋ก ์์ฑํ์ฌ ๋ฐฐ์น ํ๋ก๊ทธ๋จ ์์ฑ
๊ทธ๋ฌ๋ ๋ฐ์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
๋ ๋์ค์ ๋นํธ ์ฐ์ฐ์ ํ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์ค์๊ฐ ์ ๋ฐฉ๋ฌธ์๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๊ตฌํํ ์ ์๋ค.
์ฌ์ฉ์ ID๋ 0๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐ๋๋ค๊ณ ๊ฐ์ ํ๊ณ , string์ ๊ฐ bit๋ฅผ ํ๋์ ์ฌ์ฉ์๋ก ์๊ฐํด ๋ณด์
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ์๋น์ค์ ๋ฐฉ๋ฌธํ ๋ ์ฌ์ฉ์ ID์ ํด๋นํ๋ bit๋ฅผ 1๋ก ์ค์ ํ๋ค.
1๊ฐ์ bit๊ฐ 1๋ช ์ ์๋ฏธํ๋ฏ๋ก, ์ฒ๋ง ๋ช ์ ์ ์ ๋ ์ฒ๋ง ๊ฐ์ bit๋ก ํํํ ์ ์๊ณ , ์ด๋ ๊ณง 1.2MB์ ๋์ ํฌ๊ธฐ์ด๋ค.
๋ ๋์ค string์ ์ต๋ ๊ธธ์ด๋ 512MB์ด๋ฏ๋ก ์ฒ๋ง ๋ช ์ ์ฌ์ฉ์๋ฅผ ๋ํ๋ด๋ ๊ฑด ์ถฉ๋ถํ๋ค.
2020๋ 1์ 29์ผ์ ID๊ฐ 7์ธ ์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์.
๊ทธ๋ผ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ผ๊ณฑ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ 1๋ก ์ค์ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด ๋ ์ ์๋น์ค์ ๋ฐฉ๋ฌธํ ์ด๋ฐฉ๋ฌธ์ ์๋ฅผ ์กฐํํ๊ธฐ ์ํด์๋ ์ด ๋ฌธ์์ด์์ 1๋ก ์ค์ ๋ bit์ ๊ฐ์๋ฅผ ๊ตฌํ๋ BITCOUNT ์ฐ์ฐ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ๊ตฌํ ์ ์๊ฒ ๋๋ค..
Redis์ HyperLogLogs ํ์ ์ผ๋ก ์ด์ฉํด๋ ๋๋ค.
์ ๊ทธ๋ฆผ์ ์ค๋ช ํ์๋ฉด, ๋ง์ผ 15๋ช ์ ํ์์ด ์๋ค๊ณ ํ๋ฉด ๋นํธ 15๊ฐ๋ฅผ ์ค๋นํ๊ณ , ๊ทธ ํ์์ด ๋ฐฉ๋ฌธํ๋ฉด ํ์์ id๋ฅผ ๊ตฌํด ํด๋น ์์ ๋นํธ๋ฅผ 1๋ก ๋ฐ๊พธ๊ณ ์นด์ดํธ ํ๋ค๋ ๋ป์ด๋ค.
์ฌ๋ก 3 - ์ถ์ ์ด๋ฒคํธ ๊ตฌํํ๊ธฐ
์ ํด์ง ๊ธฐ๊ฐ๋์ ๋งค์ผ ๋ฐฉ๋ฌธํ ์ฌ์ฉ์๋ฅผ ๊ตฌํ๋ ์๋น์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น?
์ฌ๋ก 2๋ฒ์ ์ด์ฉํ์ฌ, ๊ตฌํด๋์ string ๊ฐ์ ๋นํธ๋ฅผ ๋น๊ตํ๋ BITOP ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์๋น์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
2020๋ 1์ 29์ผ๋ถํฐ 31์ผ๊น์ง ๋งค์ผ ์ ์ํ ์ฌ์ฉ์๋ id๊ฐ 7์ธ ์ฌ์ฉ์์ 11์ธ ์ฌ์ฉ์๋ผ๋ ๊ฒ์ BITOP์ ์ด์ฉํ AND ์ฐ์ฐ์ ํตํด ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
BITOP AND๋ก ๋นํธ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ์ด 1์ด ๋์ค๋ฉด ๊ทธ ํ์์ ๋งค์ผ ๋ฐฉ๋ฌธ ํ๋ค๋ ๋ป์ด๋๋ค.
์ฌ๋ก 4 - ์ต๊ทผ ๊ฒ์ ๋ชฉ๋ก ํ์ํ๊ธฐ
์ฌ๋ด ํ์ ๋๊ตฌ์ ํ๋ก์ ํธ์์ ๋ด๋น์๋ฅผ ์ ํํ ๋, ๋งค๋ฒ ๋ฉค๋ฒ๋ฅผ ๊ฒ์ํด์ ์ ๋ ฅํด์ผ ํ๋๋ฐ, ๋ด๊ฐ ์ต๊ทผ ๊ฒ์ํ๋ ๋ด๋น์๊ฐ ๋๋กญ๋ค์ด ๋ฉ๋ด๋ก ๋ณด์ฌ์ง๊ฒ ๋ง๋ค๊ณ ์ถ๋ค.
๋ง์ผ IDํ๋๊ฐ 123 ์ฌ์ฉ์(๋) ๊ฐ ์ต๊ทผ ๊ฒ์ํ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๋ณด๊ณ ์ถ๋ค๋ฉด, RDBMS๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์ผ ํ๋ค.
select * from KEYWORD
where ID = 123
order by reg_date desc
limit 5;
ํ์ง๋ง ์ด๋ ๊ฒ RDBMS์ ํ ์ด๋ธ์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค๋ฉด ์ค๋ณต ์ ๊ฑฐ๋ ํด์ผ ํ๊ณ , ๋ฉค๋ฒ๋ณ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ํ์ธํ๊ณ , ์ค๋๋ ๊ฒ์์ด๋ ์ญ์ ํ๋ ์์ ๊น์ง ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
๋ฐ๋ผ์ ์ ์ด์ ์ค๋ณต์ด ๋์ง ์๊ณ , ์ ๋ ฌ๋์ด ์๋ ๋ ๋์ค์ sorted set ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค.
sorted set์ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์, ๊ฐ์ค์น๋ก ์๊ฐ์ ์ฌ์ฉํ๋ค๋ฉด ์ด ๊ฐ์ด ๊ฐ์ฅ ํฐ, ๋์ค์ ์ ๋ ฅ๋ ์์ดํ ์ด ๋งจ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์ ์ฅ๋๋ค.
๋ฉค๋ฒ ID๊ฐ 123์ธ ์ฌ๋์ด ์ต๊ทผ ๊ฒ์ํ ์ฌ๋์ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ ๋ ฌ๋์ด ์ ์ฅ๋๋.
์ด๋ ๊ฐ์ค์น(score)๋ ์ ๋ ฅ ์๊ฐ์ ๋๋ ธ์๊ฐ์ ๋ํ๋ด๋๋ฐ, ๊ฐ์ฅ ์ฒ์ ๊ฒ์ํ ์ฌ๋์ ID๋ 46, ๊ฐ์ฅ ๋ง์ง๋ง ๊ฒ์ํ ์ฌ๋์ 50์ด ๋๊ฒ ๊ตฌ์ฑํ๋ค.
๊ทธ๋ฌ๋ฉด ๋ง์ผ ๋ด๊ฐ ID๊ฐ 51์ธ ์ฌ๋์ ๊ฒ์ํ๋ฉด ์๋์ฒ๋ผ ๋ง์ง๋ง์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๊ฒ ๋๋ค.
๋จ, ํญ์ ๋ค์ฏ ๋ช ๋ง ์ ์ฅํ๋ค๊ณ ์ค๊ณํ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์ํด์๋ ๊ฐ์ฅ ๋ง์ง๋ง ๊ฐ์ ์ง์์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฆผ์์ ๋ณด๋ฉด 0๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ง์ฐ๋ฉด ๋๊ธฐ๋ ํ๋๋ฐ, ์์ดํ ๊ฐ์๊ฐ 6๋ณด๋ค ์์ ๋์๋ 0๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์์ดํ ์ ์๋ฅผ ๋จผ์ ํ์ธํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ฒ ๋๋ค.
์ด๋ sorted set์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์์ ์ธ๋ฑ์ค๋ ์ธ๋ฑ์ค์ ๋ง์ง๋ง๋ถํฐ ํฐ ๊ฐ๋ถํฐ ์์ ๊ฐ์ผ๋ก ๋งค๊ฒจ์ง๋๋ฐ, ๋ฐ์ดํฐ์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ ๋ค, ํญ์ -6๋ฒ์งธ ์์ดํ ์ ์ง์ด๋ค๋ฉด ํน์ ๊ฐ์ ์ด์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ฒ์ ๋ฐฉ์ง ํ ์ ์๊ฒ ๋๋ค.
์ธ๋ฑ์ค๋ก ์์ดํ ์ ์ง์ฐ๋ ค๋ฉด ZREMRANGEBYRANK ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
> ZREMRANGEBYRANK recent:member:123 -6 -6
์ด๋ ๊ฒ ๋ฐ์ดํฐ์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ ๋ค, ํญ์ -6๋ฒ์งธ ์์ดํ ์ ์ง์ด๋ค๋ฉด ํน์ ๊ฐ์ ์ด์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๊ฒ ๋๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://meetup.toast.com/posts/225
http://redisgate.kr/redisgate/ent/ent_intro.php
[NHN FORWARD 2021] Redis ์ผ๋ฌด์ง๊ฒ ์ฌ์ฉํ๊ธฐ
https://redis.com/ebook/redis-in-action/