๊ฐ๋จ ์์ฝ
๋ฐ์ดํฐ ํ์ | ๋ช ๋ น์ด | ์ค๋ช | ์์ |
---|---|---|---|
Strings | SET | ๊ฐ ์ ์ฅ | `$ SET key value` |
GET | ๊ฐ ์กฐํ | `$ GET key` | |
Lists | LPUSH | ์ผ์ชฝ๋ถํฐ ๊ฐ ์ถ๊ฐ | `$ LPUSH mylist value` |
LPOP | ์ผ์ชฝ์์ ๊ฐ ์ ๊ฑฐ | `$ LPOP mylist` | |
LINDEX | ํน์ ์์น์ ๊ฐ ์กฐํ | `$ LINDEX mylist 0` | |
Sets | SADD | ๊ฐ ์ถ๊ฐ | `$ SADD myset value` |
SMEMBERS | ๋ชจ๋ ๋ฉค๋ฒ ์กฐํ | `$ SMEMBERS myset` | |
Sorted Sets(ZSets) | ZADD | ๊ฐ ๋ฐ ์ ์ ์ถ๊ฐ | `$ ZADD myzset score member` |
ZRANK | ํน์ ๋ฉค๋ฒ์ ์์ ์กฐํ | `$ ZRANK myzset member` | |
ZRANGE | ์ ์ ๋ฒ์๋ก ๋ฉค๋ฒ ์กฐํ | `$ ZRANGE myzset start stop` | |
Hashes | HSET | ํ๋์ ๊ฐ์ ์ค์ | `$ HSET myhash field value` |
HGET | ํ๋์ ๊ฐ์ ์กฐํ | `$ HGET myhash field` | |
HGETALL | ํด์์ ๋ชจ๋ ํ๋์ ๊ฐ ์กฐํ | `$ HGETALL myhash` | |
Streams | XADD | ์คํธ๋ฆผ์ ๋ฉ์์ง ์ถ๊ฐ | `$ XADD mystream * field value` |
XREAD | ์คํธ๋ฆผ์์ ๋ฉ์์ง ์ฝ๊ธฐ | `$ XREAD COUNT count STREAMS mystream start` | |
Bits(Bitmaps) | SETBIT | ๋นํธ ์ค์ | `$ SETBIT key offset value` |
GETBIT | ํน์ ๋นํธ ์กฐํ | `$ GETBIT key offset` | |
HyperLogLog(PF) | PFADD | ์์ ์ถ๊ฐ | `$ PFADD myhyperloglog value1 value2` |
PFCOUNT | ์ค๋ณต ์๋ ์์์ ์ ์กฐํ | `$ PFCOUNT myhyperloglog` | |
GEO(geospatial) | GEOADD | ์์น ์ ๋ณด ์ถ๊ฐ | `$ GEOADD mygeo long lat member` |
GEOPOS | ๋ฉค๋ฒ์ ์์น ์ ๋ณด ์กฐํ | `$ GEOPOS mygeo member` | |
GEODIST | ๋ ๋ฉค๋ฒ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ์กฐํ | `$ GEODIST mygeo member1 member2` | |
BloomFilter | BF.ADD | ์์ ์ถ๊ฐ | `$ BF.ADD myfilter value` |
BF.MADD | ์ฌ๋ฌ ์์๋ฅผ ํ ๋ฒ์ ์ถ๊ฐ | `$ BF.MADD myfilter value1 value2` |
Strings
Redis
์ Strings
๋ฐ์ดํฐ ํ์
์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ํ์
์
๋๋ค. ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๊ตฌ์ฑ๋์ด, ๋จ์ํ ๋ฌธ์์ด๋ถํฐ ์ด๋ฏธ์ง, ์ง๋ ฌํ๋ ๊ฐ์ฒด, ์ด์ง ๋ฐ์ดํฐ ๋ฑ์ ๋ค์ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. Strings
ํ์
์์ ์ ์ฅํ ์ ์๋ ๊ฐ ๋ฌธ์์ด์ ํฌ๊ธฐ๋ ์ต๋ 512MB์
๋๋ค.
SET
์ง์ ๋ ํค์ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
$ SET key value
$ SET contury korea
GET
์ง์ ๋ ํค์ ๊ฐ์ ์กฐํํฉ๋๋ค.
$ GET key
$ GET contury
MSET
์ฌ๋ฌ ๊ฐ์ ํค์ ๊ฐ์ ๋์์ ์ ์ฅํฉ๋๋ค.
$ MSET key1 value1 key2 value2...
$ MSET contury korea city seoul
MGET
์ฌ๋ฌ ํค์ ๊ฐ์ ํ ๋ฒ์ ์กฐํํฉ๋๋ค.
$ MGET key1 key...
$ MGET contury city
INCR
ํค์ ๊ฐ์ด ์ ์์ด๋ฉด, ๊ฐ์ 1 ์ฆ๊ฐ์ํต๋๋ค.
$ INCR key
$ INCR length
DECR
ํค์ ๊ฐ์ด ์ ์์ด๋ฉด, ๊ฐ์ 1 ๊ฐ์์ํต๋๋ค.
$ DECR key
$ DECR length
APPEND
์ง์ ๋ ํค์ ํ์ฌ ๊ฐ ๋ค์ ๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
$ APPEND key value
$ APPEND job programmer
ํ์ฉ ์ฌ๋ก
1. Session Management(์ธ์ ๊ด๋ฆฌ)
Redis
๋ฅผ ํ์ฉํ๋ฉด ๋น ๋ฅด๊ฒ ์ฌ์ฉ์์ ์ธ์
์ ๋ณด๋ฅผ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค. ๋ํ Redis
์ ๋ง๋ฃ ์๊ฐ ์ค์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ธ์
์ ์ ํจ๊ธฐ๊ฐ์ ๊ด๋ฆฌํ ์๋ ์์ต๋๋ค.
$ SET user:dkswnkk:session "SessionID123" EX 3600 # 1์๊ฐ ํ์ ๋ง๋ฃ๋๋ ์ธ์
์ ๋ณด ์ ์ฅ
$ GET user:dkswnkk:session # ์ฌ์ฉ์์ ์ธ์
์ ๋ณด ์กฐํ
Redis
์์๋ ':'
๊ตฌ๋ถ์๋ฅผ ํ์ฉํ์ฌ ํค์ ๊ณ์ธต์ ๋ํ๋
๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ํตํด ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
2. Contures(๊ฐ๋จํ ์นด์ดํฐ ๊ตฌํ)
์น ํ์ด์ง์ ์กฐํ์๋ ์ด๋ค ์์์ ์ฌ์ฉ ํ์์ ๊ฐ์ ์ ๋ณด๋ฅผ ์นด์ดํธํ ๋, Redis
์ String
ํ์
๊ณผ INCR
, DECR
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
$ SET page_views 0 # ํ์ด์ง ์กฐํ์ ์ด๊ธฐํ
$ INCR page_views # ํ์ด์ง ์กฐํ ์๋ง๋ค ์ฆ๊ฐ
$ INCR page_views
๊ฐ๋จํ ์นด์ดํฐ๋ Redis
์ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ์ฆ๊ฐ ์ฐ์ฐ์ ์ํํ ์ ์์ต๋๋ค.
3. Caching(์บ์ฑ)
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ๋ณต์กํ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์บ์๋ก ์ ์ฅํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ต ์๊ฐ์ ํฌ๊ฒ ๋จ์ถ์ํฌ ์ ์์ต๋๋ค. Redis
๋ In-meory DB
๋ก์จ ๋น ๋ฅธ ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์ฑ๋ฅ์ ์๋ํ๋ฏ๋ก ์ด๋ฌํ ์บ์ฑ ์ฉ๋๋ก ๋งค์ฐ ์ ํฉํฉ๋๋ค.
$ SET product:123:details "{ 'name': 'Laptop', 'price': '1000$' }" EX 600 # ์ํ ์ ๋ณด๋ฅผ 10๋ถ ๋์ ์บ์๋ก ์ ์ฅ
$ GET product:123:details # ์บ์๋ ์ํ ์ ๋ณด ๋น ๋ฅด๊ฒ ์กฐํ
์บ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ธ์ ๋ ์ง ์ฌ์์ฑ๋ ์ ์๊ธฐ ๋๋ฌธ์ Redis
์ ๋ง๋ฃ ์๊ฐ ์ค์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์บ์ ๋ฐ์ดํฐ์ ์ ํจ ๊ธฐ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค
Lists
Redis
์ Lists
๋ฐ์ดํฐ ํ์
์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Linked List)
๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ, ๋ฆฌ์คํธ์ ์, ๋ค, ์ ๋์์ ์์ดํ
์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋ ํนํ ์ ์ฉํฉ๋๋ค. ๋ํ ์์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ด์ฉ๋ฉ๋๋ค.
LPUSH
๋ฆฌ์คํธ์ ์์ชฝ(์ผ์ชฝ)์ ํ๋ ์ด์์ ๊ฐ๋ค์ ์ถ๊ฐํฉ๋๋ค.
$ LPUSH fruits apple
$ LPUSH fruits banana orange
RPUSH
๋ฆฌ์คํธ์ ๋ค์ชฝ(์ค๋ฅธ์ชฝ)์ ํ๋ ์ด์์ ๊ฐ๋ค์ ์ถ๊ฐํฉ๋๋ค.
$ RPUSH fruits kiwi
$ RPUSH fruits grape melon
LPOP
๋ฆฌ์คํธ์ ์์ชฝ(์ผ์ชฝ) ๊ฐ์ ์ ๊ฑฐํ๊ณ ๊ทธ ๊ฐ์ ๋ฐํํฉ๋๋ค.
$ LPOP fruits
RPOP
๋ฆฌ์คํธ์ ๋ค์ชฝ(์ค๋ฅธ์ชฝ) ๊ฐ์ ์ ๊ฑฐํ๊ณ ๊ทธ ๊ฐ์ ๋ฐํํฉ๋๋ค.
$ RPOP fruits
LRANGE
๋ฆฌ์คํธ์์ ํน์ ๋ฒ์์ ์์๋ค์ ์กฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. LRANGE key start stop
ํ์์ผ๋ก ์ฌ์ฉํ๋ฉฐ, start
์ stop
์ ์ธ๋ฑ์ค๋ก๋ถ์ 0๋ถํฐ ์์ํฉ๋๋ค. ๋ง์ฝ ์์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋ฆฌ์คํธ์ ๋์์๋ถํฐ ์ญ์์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
ex) ์ฒซ ๋ฒ์งธ๋ถํฐ ์ธ ๋ฒ์งธ ์์๊น์ง ์กฐํ
$ LPUSH mylist "three" "two" "one"
$ LRANGE mylist 0 2
> "one", "two", "three"
ex) ๋ฆฌ์คํธ์ ๋ง์ง๋ง ์ธ ์์ ์กฐํ
$ LRANGE mylist -3 -1
> "one", "two", "three"
ex) ์ ์ฒด ๋ฆฌ์คํธ ์กฐํ
$ LRANGE mylist 0 -1
> "one", "two", "three"
LINDEX
๋ฆฌ์คํธ์์ ํน์ ์์น์ ์์๋ฅผ ์กฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. LINDEX key index
ํ์์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
ex) ์ฒซ ๋ฒ์งธ ์์ ์กฐํ
$ LPUSH mylist "three" "two" "one"
$ LINDEX mylist 0
> "one"
ex) ์ธ ๋ฒ์งธ ์์ ์กฐํ
$ LPUSH mylist "three" "two" "one"
$ LINDEX mylist 2
> "three"
ex) ๋ง์ง๋ง ์์ ์กฐํ
$ LPUSH mylist "three" "two" "one"
$ LINDEX mylist -1
> "three"
ํ์ฉ ์ฌ๋ก
1. Task Queue(์์ ๋๊ธฐ์ด)
Redis
์ List
๋ฐ์ดํฐ ํ์
์ FIFO(FIrst-In-FIrst-Out)
์ ํน์ฑ์ ๊ฐ์ง๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์
์์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์์
๋ค์ ๋๊ธฐ์ด์ ๋ฃ์ด๋๊ณ , ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ค๋ ๋๊ฐ ์ฐจ๋ก๋๋ก ์์
์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค.
$ LPUSH taskQueue "send email" # ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ ์์
์ ๋๊ธฐ์ด์ ๋งจ ์์ ์ถ๊ฐ
$ LPUSH taskQueue "resize image" # ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ์์
์ ๋๊ธฐ์ด์ ๋งจ ์์ ์ถ๊ฐ
$ RPOP taskQueue # ๋๊ธฐ์ด์์ ๊ฐ์ฅ ์ค๋๋ ์์
(๊ฐ์ฅ ๋ค์ชฝ์ ์๋ ์์
)์ ๊ฐ์ ธ์ ์ฒ๋ฆฌ
2. Activity Stream(ํ๋ ๊ธฐ๋ก)
์ฌ์ฉ์์ ์ต๊ทผ ํ๋์ด๋ ์ด๋ฒคํธ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์๋๋ก ์ถ์ ํ๊ณ ์ ์ฅํ์ฌ ์ค์๊ฐ ๋ถ์์ธ ๋์๋ณด๋ ์
๋ฐ์ดํธ์ ํ์ฉ๋ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ LPUSH
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ก๊ทธ๋ฅผ ๋ฆฌ์คํธ์ ์์ชฝ์ ์ถ๊ฐํ๋ฏ๋ก, ์ต์ ์ ๋ก๊ทธ๊ฐ ํญ์ ๋งจ ์์ ์์นํ๊ฒ ๋ฉ๋๋ค.
$ LPUSH user:1234:activity "logged in" # ์ฌ์ฉ์ ๋ก๊ทธ์ธ ๋ก๊ทธ ๊ธฐ๋ก
$ LPUSH user:1234:activity "viewed profile" # ์ฌ์ฉ์ ํ๋กํ ์กฐํ ๋ก๊ทธ ๊ธฐ๋ก
$ LPUSH user:1234:timeline "Posted a new photo" # ์ฌ์ง ์
๋ก๋ ๋ก๊ทธ ๊ธฐ๋ก
$ LPUSH user:1234:timeline "Updated profile" # ํ๋กํ ์
๋ฐ์ดํธ ๋ก๊ทธ ๊ธฐ๋ก
...
$ LRANGE user:1234:timeline 0 9 # ์ฌ์ฉ์์ ์ต๊ทผ 10๊ฐ ๋ก๊ทธ ์กฐํ
3. Pagination(ํ์ด์ง๋ค์ด์ )
List
์ ์ผ๋ถ๋ถ์ LRANGE
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ค๋ ํน์ฑ์ ํ์ฉํ์ฌ ์น ํ์ด์ง๋ ์ฑ์์ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ถ๋ง์ ํ๋ฉด์ ํ์ํ๋ ํ์ด์ง๋ค์ด์
์ ๊ตฌํํ ์ ์์ต๋๋ค.
$ LPUSH articles "article3" # ์ธ ๋ฒ์งธ ๊ธฐ์ฌ๋ฅผ ๋งจ ์์ ์ถ๊ฐ
$ LPUSH articles "article2" # ๋ ๋ฒ์งธ ๊ธฐ์ฌ๋ฅผ ๋งจ ์์ ์ถ๊ฐ
$ LPUSH articles "article1" # ์ฒซ ๋ฒ์งธ ๊ธฐ์ฌ๋ฅผ ๋งจ ์์ ์ถ๊ฐ
$ LRANGE articles 0 2 # ์ฒ์๋ถํฐ ์ธ ๋ฒ์งธ ๊ธฐ์ฌ๊น์ง ์กฐํ
4. Real-time Chat History(์ค์๊ฐ ์ฑํ ๊ธฐ๋ก)
์ค์๊ฐ ์ฑํ ์์๋ ์ฌ์ฉ์๋ค ์ฌ์ด์ ๋ํ ๋ด์ฉ์ ์ค์๊ฐ์ผ๋ก ์ ์ฅํ๊ณ , ์๋ก์ด ์ฌ์ฉ์๊ฐ ์ฑํ ๋ฐฉ์ ๋ค์ด์์ ๋ ์ต๊ทผ ๋ํ ๋ด์ฉ์ ์กฐํํ ์ ์์ต๋๋ค.
Sets
Redis
์ Sets
๋ฐ์ดํฐ ํ์
์ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ๋ฌธ์์ด ์งํฉ์ ์ ์ฅํฉ๋๋ค. Set
์ ์ถ๊ฐ, ์ญ์ ๋ฐ ์กด์ฌํ๋์ง ๊ฒ์ฌํ๋ ์ฐ์ฐ์ O(1)
์ ์๊ฐ ๋ณต์ก๋๋ก ์ ๊ณตํฉ๋๋ค.
SADD
Set
์ ํ๋ ์ด์์ ๊ฐ๋ค์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ฝ ์ด๋ฏธ Set
์ ์กด์ฌํ๋ ๊ฐ์ ์ถ๊ฐํ๋ ค๊ณ ์๋ํ๋ค๋ฉด ํด๋น ์ฐ์ฐ์ ๋ฌด์๋๋ฉฐ, ์ฑ๊ณตํ๋ค๋ฉด ์ถ๊ฐ๋ ๊ฐ์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
$ SADD myset "value1"
> (integer) 1
$ SADD myset "value2" "value3"
> (integer) 2
$ SADD myset "value3"
> (integer) 0
SMEMBERS
Set
์ ํฌํจ๋ ๋ชจ๋ ๊ฐ์ ์กฐํํฉ๋๋ค.
$ SMEMBERS myset
> "value1", "value2", "value3"
SREM
Set
์์ ํ๋ ์ด์์ ๊ฐ์ ์ ๊ฑฐํฉ๋๋ค. ๋ฐํ๊ฐ์ ์ ๊ฑฐ๋ ๊ฐ์ ์์
๋๋ค.
$ SREM myset "value1"
> (integer) 1
$ SREM myset "value2" "value3"
> (integer) 2
SISMEMBER
ํน์ ๊ฐ์ด Set
์ ์๋์ง ํ์ธํฉ๋๋ค. ์๋ค๋ฉด 1
, ์๋ค๋ฉด 0
์ ๋ฐํํฉ๋๋ค.
$ SISMEMBER myset "value1"
> (integer) 1
$ SISMEMBER myset "value4"
> (integer) 0
SCARD
Set
์ ๊ฐ ์๋ฅผ ๋ฐํํฉ๋๋ค.
$ SCARD myset
> (integer) 2
SDIFF
๋ Set
๊ฐ์ ์ฐจ์งํฉ
์ ๋ฐํํฉ๋๋ค.
$ SADD set1 "a" "b" "c"
> (integer) 3
$ SADD set2 "b" "c" "d"
> (integer) 3
$ SDIFF set1 set2
> "a"
SINTER
๋ Set
๊ฐ์ ๊ต์งํฉ
์ ๋ฐํํฉ๋๋ค.
$ SINTER set1 set2
> "b", "c"
SUNION
๋ Set
๊ฐ์ ํฉ์งํฉ
์ ๋ฐํํฉ๋๋ค.
$ SUNION set1 set2
> "a", "b", "c", "d"
ํ์ฉ ์ฌ๋ก
1. Unique Item Collection(๊ณ ์ ํ ํญ๋ชฉ์ ์งํฉ)
๊ฒ์๋ฌผ์ ์ถ๊ฐ๋ ํ๊ทธ๋ ํน์ ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ ์์ดํ
์ ๊ด๋ฆฌํ ๋ Sets
๋ฅผ ํ์ฉํ๋ฉด ์ค๋ณต์ ๋ฐฉ์งํ๋ฉด์ ํจ์จ์ ์ผ๋ก ํญ๋ชฉ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
$ SADD article:tags "news" "tech" "redis"
> (integer) 3
$ SMEMBERS article:tags
> "news", "tech", "redis"
2. User Tracking(์ฌ์ฉ์ ์ถ์ )
์น ์ฌ์ดํธ์ ๋ฐฉ๋ฌธํ ์ฌ์ฉ์์ IP ์ฃผ์๋ ID ๋ฑ์ Set
์ ์ ์ฅํ์ฌ, ํน์ ๊ธฐ๊ฐ ๋์์ ๊ณ ์ ํ ๋ฐฉ๋ฌธ์ ์๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
$ SADD visitors:today "192.168.0.1" "192.168.0.2"
> (integer) 2
$ SCARD visitors:today
> (integer) 2
Sorted Sets(ZSets)
Redis
์ ZSets
๋ฐ์ดํฐ ํ์
์ Set
๊ณผ ์ ์ฌํ๊ฒ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ๋ฉค๋ฒ๋ฅผ ์ ์ฅํ์ง๋ง, ๊ฐ ๋ฉค๋ฒ๋ ์ฐ๊ด๋ ์ ์(score)
๋ฅผ ๊ฐ์ง๋ฉฐ ์ด ์ ์์ ๋ฐ๋ผ ์ ๋ ฌ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉค๋ฒ ๊ฐ์ ์์๋ฅผ ์ ์งํ๋ฉด์๋ Set
์ ๋ชจ๋ ์ฅ์ ์ ํ์ฉํ ์ ์์ต๋๋ค.
ZADD
ZSet
์ ๋ฉค๋ฒ์ ํด๋น ๋ฉค๋ฒ์ ์ ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
$ ZADD myzset 1 "one"
> (integer) 1
$ ZADD myzset 2 "two" 3 "three"
> (integer) 2
ZRANGE
ZSet
์์ ์ง์ ๋ ๋ฒ์์ ๋ฉค๋ฒ๋ฅผ ์ ์์ ๋ฐ๋ผ ์ ๋ ฌํ์ฌ ๋ฐํํฉ๋๋ค. WITHSCORES
์ต์
์ ์ถ๊ฐํ๋ฉด, ๋ฐํ๋ ๋ฉค๋ฒ ์์ ํด๋น ๋ฉค๋ฒ์ ์ ์๋ ํจ๊ป ํ์๋ฉ๋๋ค.
$ ZRANGE myzset 0 -1
> "one", "two", "three"
$ ZRANGE myzset 0 -1 WITHSCORES
> "one", "1", "two", "2", "three", "3"
ZREM
ZSet
์์ ํ๋ ์ด์์ ๋ฉค๋ฒ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
$ ZREM myzset "one"
> (integer) 1
ZCARD
ZSet
์ ์๋ ๋ฉค๋ฒ์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
$ ZCARD myzset
> (integer) 2
ZSCORE
ํน์ ๋ฉค๋ฒ์ ์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
$ ZSCORE myzset "three"
> "3"
ZRANK
ํน์ ๋ฉค๋ฒ๊ฐ ZSet
๋ด์์ ๊ฐ์ง ์์๋ฅผ ๋ฐํํฉ๋๋ค. ์์๋ 0
๋ถํฐ ์์ํฉ๋๋ค.
$ ZRANK myzset "two"
> (integer) 1
ZREVRANK
์ ์๊ฐ ๋์ ์์ผ๋ก ์ ๋ ฌํ์ ๋์ ํน์ ๋ฉค๋ฒ์ ์์๋ฅผ ๋ฐํํฉ๋๋ค.
$ ZREVRANK myzset "two"
> (integer) 0
ํ์ฉ ์ฌ๋ก
1. Leaderboards(๋ฆฌ๋๋ณด๋)
์ฌ์ฉ์์ ์ ์๋ ์ฑ๊ณผ๋ฅผ ๊ธฐ๋กํ๊ณ , ๋ค๋ฅธ ์ฌ์ฉ์๋ค๊ณผ์ ๋ญํน์ ๋น๊ตํ ๋ ZSets
๋ ์์ฃผ ์ ์ฉํฉ๋๋ค. ์ฌ์ฉ์์ ์ ์๋ Score
๋ก ์ ์ฅ๋๋ฉฐ, ZSets
์ ์ ๋ ฌ ๊ธฐ๋ฅ์ ํตํด ๋ญํน์ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
$ ZADD leaderboard 1500 "user123" # user123์ ์ ์๋ฅผ 1500์ผ๋ก ์ ์ฅ
$ ZADD leaderboard 1700 "user456" # user456์ ์ ์๋ฅผ 1700์ผ๋ก ์ ์ฅ
$ ZRANGE leaderboard 0 -1 WITHSCORES # ๋ชจ๋ ์ฌ์ฉ์์ ๋ญํน๊ณผ ์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ํ์ธ
2. ์๊ฐ์ ๋ฐ๋ฅธ ๋ก๊ทธ ๊ด๋ฆฌ
ํน์ ์ด๋ฒคํธ๋ ๋ก๊ทธ๊ฐ ๋ฐ์ํ ์๊ฐ์ ์ ์๋ก ์ฌ์ฉํ์ฌ ZSets
์ ์ ์ฅํ๋ฉด, ์๊ฐ ์์๋๋ก ์ด๋ฒคํธ๋ ๋ก๊ทธ๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ต๊ทผ ๋ก๊ทธ ๋๋ ํน์ ์๊ฐ๋์ ๋ก๊ทธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
$ ZADD eventLog 1630755600 "User logged in" # ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ด๋ฒคํธ ๊ธฐ๋ก
$ ZADD eventLog 1630758600 "User uploaded a file" # ํ์ผ ์
๋ก๋ ์ด๋ฒคํธ ๊ธฐ๋ก
$ ZRANGE eventLog 0 -1 WITHSCORES # ๋ชจ๋ ๋ก๊ทธ์ ๊ทธ ๋ฐ์ ์๊ฐ์ ์กฐํ
3. ์ ์์ ์์ ๋ฐ ์ ์ ์๊ฐ ๊ธฐ๋ก
์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ํ ๋๋ง๋ค, ์ ์ํ ์๊ฐ์ ์ ์๋ก ์ฌ์ฉํ์ฌ ZSets
์ ์ ์ฅํ๋ฉด, ์ต๊ทผ ์ ์์๋ ๊ฐ์ฅ ์ค๋ซ๋์ ์ ์ํ์ง ์์ ์ฌ์ฉ์ ๋ฑ์ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ํ์
ํ ์ ์์ต๋๋ค.
$ ZADD lastAccess 1630755600 "user123" # user123์ ๋ง์ง๋ง ์ ์ ์๊ฐ ๊ธฐ๋ก
$ ZADD lastAccess 1630758600 "user456" # user456์ ๋ง์ง๋ง ์ ์ ์๊ฐ ๊ธฐ๋ก
$ ZREVRANGE lastAccess 0 4 WITHSCORES # ๋ง์ง๋ง์ผ๋ก ์ ์ํ 5๋ช
์ ์ฌ์ฉ์์ ๊ทธ ์ ์ ์๊ฐ์ ์กฐํ
Hashes
Redis
์ Hash
๋ฐ์ดํฐ ํ์
์ ํ๋์ ๊ฐ์ ๊ฐ์ง ๋งต์ผ๋ก, ๊ฐ ํ๋๋ ๋ฌธ์์ด ๊ฐ์ ๊น์ง ์ ์์ต๋๋ค. Hash
๋ ๊ฐ์ฒด์ ๋น์ทํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์๊ฐํ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ํ๋์ ๊ฐ์ ๋์์ ์ ์ฅํ๊ณ ๊ฒ์ํ ์ ์์ต๋๋ค. ๋ํ, ๊ฐ ํ๋์ ํฌ๊ธฐ๋ ์์ ๋ฐ์ดํฐ๋ถํฐ ํฐ ๋ฐ์ดํฐ๊น์ง ์ ์ฅํ ์ ์์ต๋๋ค.
Hash๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค๊ฐ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
HSET
ํ๋ ์ด์์ key-value
์์ Hash
์ ์ ์ฅํฉ๋๋ค. ๋ง์ฝ ํด๋น ํ๋๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด, ๊ทธ ๊ฐ์ ๋ฎ์ด์์์ง๋๋ค.
$ HSET user:1234 name "Juhyeong" age 26
HGET
Hash
์์ ์ ์ฅํ ํ๋์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
$ HGET user:1234 name
> "Juhyeong"
HGETALL
Hash
์ ๋ชจ๋ ํ๋์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
$ HGETALL user:1234
> "name", "Juhyeong", "age", "26"
HMSET
์ฌ๋ฌ ํ๋์ ๊ฐ์ ํ ๋ฒ์ Hash
์ ์ ์ฅํฉ๋๋ค.
$ HMSET user:1234 name "Ahn" age "26" email "dkswnkk@example.com"
HMGET
์ฌ๋ฌ ํ๋์ ๊ฐ์ ํ ๋ฒ์ ๊ฐ์ ธ์ต๋๋ค.
$ HMGET user:1234 name email
> "Juhyeong", "dkswnkk@example.com"
HINCRBY
Hash
์ ์ง์ ํ ํ๋์ ์ซ์ ๊ฐ์ ์ฆ๊ฐ์ํต๋๋ค.
$ HINCRBY user:1234 age 1
> 27
HDEL
Hash
์์ ํ๋ ์ด์์ ํ๋๋ฅผ ์ญ์ ํฉ๋๋ค.
$ HDEL user:1234 age
HEXISTS
์ง์ ํ ํ๋๊ฐ Hash
์ ์๋์ง ํ์ธํฉ๋๋ค.
$ HEXISTS user:1234 email
> (integer) 0 or 1
HLEN
Hash
์ ํ๋ ๊ฐ์๋ฅผ ๋ฐํํฉ๋๋ค.
$ HLEN user:1234
> 1
HKEYS
Hash
์ ๋ชจ๋ ํ๋๋ฅผ ๋ฐํํฉ๋๋ค.
$ HKEYS user:1234
> "name"
HVALS
Hash
์ ๋ชจ๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.
$ HVALS user:1234
> "dkswnkk"
ํ์ฉ ์ฌ๋ก
Strings
๋ฐ์ดํฐ ํ์
์ ํ์ฉ ์ฌ๋ก์ ๊ฑฐ์ ์ ์ฌํฉ๋๋ค.
1. Object Storage(๊ฐ์ฒด ์ ์ฅ)
Redis
์ Hashes
๋ ๊ฐ์ฒด์ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์์ฃผ ์ ํฉํฉ๋๋ค. ์ฌ์ฉ์ ํ๋กํ, ์ค์ , ์ํ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ key-value
์์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
$ HSET user:1234 name "Ahn JuHyeong" age 26 email "dkswnkk@example.com" # user:1234์ ์ ๋ณด๋ฅผ ์ ์ฅ
$ HSET user:5678 name "Kim Jenny" age 28 email "jenny@example.com" # user:5678์ ์ ๋ณด๋ฅผ ์ ์ฅ
$ HGETALL user:1234 # user:1234์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์กฐํ
2. Real-time Counters(์ค์๊ฐ ์นด์ดํฐ)
์ค์๊ฐ์ผ๋ก ์
๋ฐ์ดํธ๋๋ ์นด์ดํฐ ๊ฐ๋ค์ ์ ์ฅํ๋๋ฐ Hashes
๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ์น์ฌ์ดํธ์ ํ์ด์ง๋ทฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํด๋ฆญ ์ ๋ฑ์ ์ ์ฅํ ์ ์์ต๋๋ค.
$ HINCRBY pageViews homepage 1 # ํํ์ด์ง์ ํ์ด์ง๋ทฐ๋ฅผ 1 ์ฆ๊ฐ
$ HINCRBY pageViews productPage 1 # ์ ํ ํ์ด์ง์ ํ์ด์ง๋ทฐ๋ฅผ 1 ์ฆ๊ฐ
$ HGET pageViews homepage # ํํ์ด์ง์ ํ์ด์ง๋ทฐ ์กฐํ
3. Configurations and Settings(๊ตฌ์ฑ ๋ฐ ์ค์ )
์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑ ๊ฐ์ด๋ ์ค์ ์ ์ ์ฅํ๊ณ ์กฐํํ๋ ๋ฐ Hashes
๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
$ HSET appConfig theme "dark" fontSize "medium" notifications "on" # ์ ํ๋ฆฌ์ผ์ด์
์ค์ ์ ์ฅ
$ HGET appConfig theme # ํ
๋ง ์ค์ ๊ฐ ์กฐํ
4. Caching(์บ์ฑ)
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ ๋ณต์กํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์บ์๋ก ์ ์ฅํ ๋ Hashes
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด, ๋์ผํ ์ฟผ๋ฆฌ๋ ๊ณ์ฐ์ ๋ค์ ์ํํ ํ์ ์์ด ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
$ HSET queryResult:5678 productCount 120 userCount 500 # ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ ์ฅ
$ HGET queryResult:5678 productCount # ์ฟผ๋ฆฌ๋ก ์ป์ ์ ํ ์ ์กฐํ
Streams
Redis Streams
๋ 2018๋
์ Redis 5.0
์ ๋์
๋ ์๊ณ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. ์คํธ๋ฆผ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ , ๋ฉ์์ง๋ ํ๋์ ๊ฐ์ ๊ฐ์ง๋ ํญ๋ชฉ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ฐ ํญ๋ชฉ์๋ ์์๋ฅผ ๋ํ๋ด๋ ๊ณ ์ ํ ID๊ฐ ์์ต๋๋ค.
- Entry ID: ๊ฐ ํญ๋ชฉ์ '-'์ ํ์์ผ๋ก ๊ณ ์ ํ ID๋ฅผ ๊ฐ์ง๋๋ค. ์๋ฅผ ๋ค๋ฉด '1518951480106-0'์ ๋๋ค.
- Consumer Groups: ์ฌ๋ฌ ์๋น์๊ฐ ์คํธ๋ฆผ์ ์ฝ์ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์๋น์ ๊ทธ๋ฃน์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค๊ฐ ๋์ผํ ์คํธ๋ฆผ์ ๋์์ ์ฝ์ ์ ์์ต๋๋ค.
XADD
Stream
์ ์๋ก์ด ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. '\*'
๋ Redis
์๊ฒ ID
๋ฅผ ์๋ ์์ฑํ๋๋ก ์ง์ํฉ๋๋ค.
$ XADD mystream * sensor-id 1234 temperature 19.8
XRANGE & XREVRANGE
์ง์ ๋ ID ๋ฒ์์ ํญ๋ชฉ์ ์์๋๋ก ๋๋ ์ญ์์ผ๋ก ์กฐํํฉ๋๋ค.
$ XRANGE mystream - + COUNT 10
์ ๋ช
๋ น์ Stream
์ ์ฒ์๋ถํฐ ๋๊น์ง ์ต๋ 10๊ฐ์ ํญ๋ชฉ์ ๋ฐํํฉ๋๋ค.
XDEL
XDEL
์ ์ฌ์ฉํ์ฌ Redis Streams
์ ํน์ ํญ๋ชฉ์ ์ญ์ ํ ์ ์์ต๋๋ค.
$ XADD mystream * name Juhyeong
-> "1617856879455-0"
$ XDEL mystream 1617856879455-0
-> (integer) 1
Stream
์์ ํญ๋ชฉ์ ์ญ์ ํด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ์ ๊ฐ์ํ์ง ์์ ์ ์์ต๋๋ค. Redis
๋ ๋ด๋ถ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌํ์ฉํ๋ฏ๋ก, ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ฐ์๋ ์ญ์ ํ ์ด๋ ์ ๋ ์๊ฐ์ด ์ง๋์ผ ๊ด์ฐฐ๋ ์ ์์ต๋๋ค.
ํ์ฉ์ฌ๋ก
1. Event Sourcing(์ด๋ฒคํธ ์์ฑ)
์ด๋ฒคํธ ์์ฑ์ ์ํ๊ฐ ์๋ ๋ณ๊ฒฝ ์ฌํญ(์ด๋ฒคํธ)์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์ํ ๊ณ์ข์ ์์ก ๋์ ์
๊ธ ๋ฐ ์ถ๊ธ ํธ๋์ญ์
์ ์ ์ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ณผ๊ฑฐ์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ๊ณ ํ์ฌ ์ํ๋ฅผ ์ฌ์์ฑํ ์ ์์ต๋๋ค. Redis Streams
๋ ์ด๋ฌํ ์ฉ๋๋ก ์ฌ์ฉํ๊ธฐ ์ ํฉํฉ๋๋ค.
$ XADD transactions * type deposit amount 100
$ XADD transactions * type withdraw amount 50
2. ๋ก๊น ๋ฐ ๋ชจ๋ํฐ๋ง
์์คํ
์ ๋ค์ํ ์ปดํฌ๋ํธ์์ ๋ฐ์ํ๋ ๋ก๊ทธ ๋๋ ์ด๋ฒคํธ๋ฅผ ์ค์ ์ง์ค์์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ฑฐ๋ ์ ์ฅํ๋ ค๋ ๊ฒฝ์ฐ Redis Streams
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ XADD logs * level error message "Database connection failed"
$ XADD logs * level info message "User logged in"
3. ์ค์๊ฐ ๋์๋ณด๋ ๋ฐ ๋ถ์
์ ํ๋ฆฌ์ผ์ด์
์ ์ค์๊ฐ ์ฌ์ฉ ํํฉ, ์ฑ๋ฅ ์งํ, ์ฌ์ฉ์ ํ๋ ๋ฑ์ ์ค์๊ฐ ๋์๋ณด๋์ ํ์ํ๋ ค๋ฉด Redis Streams
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ์บก์ฒํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
$ XADD user_activity * action login user_id 1234
$ XADD system_metrics * cpu_usage 75 memory_usage 60
4. ๋ถ์ฐ ํ์คํฌ ํ
๋ค์ํ ์์
์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๋ ค๋ฉด, ์์
ํญ๋ชฉ์ Stream
์ ์ถ๊ฐํ๊ณ ์ฌ๋ฌ ์์
์ ๋๋ ํ๋ก์ธ์๊ฐ Stream
์์ ์์
์ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
$ XADD tasks * task_type email payload "{...}"
5. ์๊ฐ์ ์ด๋ฒคํธ ์ ์ฅ
์ด๋ฒคํธ๋ฅผ ์๊ฐ์์ผ๋ก ์ ์ฅํ๊ณ ๋ถ์ํ๋ ค๋ฉด Redis Streams
์ ์๊ฐ ๊ธฐ๋ฐ ์ธ๋ฑ์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค.
$ XADD events * timestamp "2023-01-01T12:00:00" event_type "purchase" user_id 4567
Bits(Bitmaps)
Redis
์ Bits
, ๋๋ Bitmaps
๋ ์ ์ ๋ฐฐ์ด์ ๋นํธ์ฐ์ฐ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํน๋ณํ ๋ฐ์ดํฐ ํ์
์
๋๋ค. ์ด ๋ฐ์ดํฐ ํ์
์ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋นํธ๋ฅผ ์ ์ฅํ๊ณ , ๊ฐ ๋นํธ์ ์ ๊ทผํ์ฌ ๊ฐ์ ์ค์ ํ๊ฑฐ๋ ์ฝ์ ์ ์์ต๋๋ค. Redis
์์ ๋นํธ๋ SETBIT
, GETBIT
, BITOP
๋ฑ์ ๋ช
๋ น์ ํตํด ์กฐ์๋ฉ๋๋ค.
SETBIT
์ง์ ๋ ํค์ ํน์ ์์น์ ์๋ ๋นํธ ๊ฐ์ ์ค์ ํฉ๋๋ค.
$ SETBIT user:log-in:23-09-01 123 1 # '23-09-01' ๋ ์ง์ ์ฌ์ฉ์ ID '123'์ด ๋ก๊ทธ์ธํ ๊ฒ์ ๋นํธ๋ก ํ์
GETBIT
์ง์ ๋ ํค์ ํน์ ์์น์ ์๋ ๋นํธ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
$ GETBIT user:log-in:23-09-01 123 # '23-09-01' ๋ ์ง์ ์ฌ์ฉ์ ID '123'์ด ๋ก๊ทธ์ธํ๋์ง ํ์ธ
BITOP
์ฌ๋ฌ ํค์ ์ ์ฅ๋ ๋นํธ๋งต๋ค ์ฌ์ด์ ๋นํธ ์ฐ์ฐ์ ์ํํฉ๋๋ค. AND
, OR
, XOR
, NOT
์ฐ์ฐ์ ์ง์ํฉ๋๋ค.
$ SETBIT user:1:log-in:January 1 1
$ SETBIT user:1:log-in:January 3 1
$ SETBIT user:2:log-in:January 1 1
$ SETBIT user:2:log-in:January 2 1
# 1๋ฒ ์ฌ์ฉ์์ 2๋ฒ ์ฌ์ฉ์ ๋ชจ๋ ๊ฐ์ ๋ ์ ๋ก๊ทธ์ธํ๋์ง ํ์ธํ๊ณ ์ถ์ ๋ AND ์ฐ์ฐ์ ์ฌ์ฉ
$ BITOP AND both-logged-in:January user:1:log-in:January user:2:log-in:January
# ์์ ๋ ์ฌ์ฉ์ ์ค ์ด๋ ํ ๋ช
์ด๋ผ๋ ๋ก๊ทธ์ธํ ๋ ์ ๊ธฐ๋ก์ ์ป๊ณ ์ถ๋ค๋ฉด OR ์ฐ์ฐ์ ์ฌ์ฉ
$ BITOP OR any-logged-in:January user:1:log-in:January user:2:log-in:January
# ๋ ์ฌ์ฉ์๊ฐ ์๋ก ๋ค๋ฅธ ๋ ์ ๋ก๊ทธ์ธํ ๋ ๋ง ๊ธฐ๋กํ๊ณ ์ถ๋ค๋ฉด XOR ์ฐ์ฐ์ ์ฌ์ฉ
$ BITOP XOR diff-logged-in:January user:1:log-in:January user:2:log-in:January
#1๋ฒ ์ฌ์ฉ์์ ๋ก๊ทธ์ธํ์ง ์์ ๋ ์ ์๊ณ ์ถ๋ค๋ฉด NOT ์ฐ์ฐ์ ์ฌ์ฉ
$ BITOP NOT user:1:not-logged-in:January user:1:log-in:January
BITCOUNT
์ฃผ์ด์ง ๋ฒ์ ๋ด์์ ์ง์ ๋ ํค์ ์ค์ ๋ ๋นํธ์ ์๋ฅผ ์นด์ดํธํฉ๋๋ค.
$ BITCOUNT user:log-in:23-09-01 # '23-09-01'์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์๋ฅผ ์นด์ดํธ
BITOPS
์ง์ ๋ ๊ฐ(0
๋๋ 1
)์ ์ฒซ ๋ฒ์งธ ๋นํธ ์์น๋ฅผ ์ฐพ์ต๋๋ค.
$ BITPOS user:log-in:23-09-01 1 # '23-09-01'์ ์ฒ์์ผ๋ก ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ID์ ์์น๋ฅผ ์ฐพ์
ํ์ฉ ์ฌ๋ก
1. ์ผ๋ณ ์ฌ์ฉ์ ํ๋ ์ถ์
ํน์ ์ผ์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋์ง, ๊ตฌ๋งคํ๋์ง, ํน์ ์ฝํ ์ธ ๋ฅผ ๋ณธ ๊ฒ์ธ์ง ๋ฑ์ ํ๋์ ๋นํธ๋ก ํ์ํ์ฌ ์ผ๋ณ๋ก ์ฌ์ฉ์์ ํ๋์ ์ถ์ ํ ์ ์์ต๋๋ค.
$ SETBIT user:log-in:23-01-01 123 1
$ SETBIT user:purchase:23-01-01 123 1
HyperLogLog(PF)
Redis
์ HyperLogLog
๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์งํฉ์์ ๊ณ ์ ํ ํญ๋ชฉ์ ์๋ฅผ ์ถ์ ํ๊ธฐ ์ํ ํจ์จ์ ์ธ ์๋ฃ๊ตฌ์กฐ์
๋๋ค. ์ค์ ๋ก ์ ํํ ์นด์ดํธ๊ฐ ์๋ "์ถ์ ์น"๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ฌํ ํน์ฑ ๋๋ถ์ HyperLogLog
๋ ๋งค์ฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ(์ฝ 12KB)
๋ฅผ ์ฌ์ฉํ์ฌ ์์ญ์ต ๊ฐ์ ์์ดํ
์นด๋๋๋ฆฌํฐ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค.
์ฃผ์ ํน์ง
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ๋ง์ ์์ ๋ฐ์ดํฐ์ ๋ํ ์นด๋๋๋ฆฌํฐ๋ฅผ ์ถ์ ํ ๋ ๊ณ ์ ๋ ์๋์ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฌ์ฉํฉ๋๋ค.
- ํฉ๋ณ ๊ฐ๋ฅ: ์ฌ๋ฌ HyperLogLog ๊ตฌ์กฐ๋ฅผ ํ๋๋ก ํฉ์ณ์ ์ถ์ ์ ํ ์ ์์ต๋๋ค.
- ์ ํ๋: ํฐ ๋ฐ์ดํฐ ์ ์ ๊ฒฝ์ฐ ์ฝ 0.81%์ ํ์ค ์ค์ฐจ๊ฐ ์์ต๋๋ค.
PFADD
ํน์ HyperLogLog
์ ํ๋ ์ด์์ ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
$ PFADD users:visited user123 user456 user789
> (integer)1
PFADD
์ ๋ฐํ๊ฐ์ HyperLogLog
์ ๋ด๋ถ ์ํ๊ฐ ๋ณ๊ฒฝ๋์๋์ง๋ฅผ ๋ํ๋
๋๋ค. 1
์ ๋ณ๊ฒฝ๋์์์, 0
์ ๋ณ๊ฒฝ๋์ง ์์์์ ์๋ฏธํฉ๋๋ค.
PFCOUNT
HyperLogLog
์์ ๊ณ ์ ํ ์์์ ๊ฐ์๋ฅผ ์ถ์ ํฉ๋๋ค.
$ PFCOUNT users:visited
> (integer)3
PFMERGE
๋ ๊ฐ ์ด์์ HyperLogLogs
๋ฅผ ๋ณํฉํ์ฌ ์๋ก์ด ํ๋์ HyperLogLog
๋ก ๋ง๋ญ๋๋ค.
$ PFMERGE combinedUsers users:visitedJan users:visitedFeb
> OK
๋ฉ๋ชจ๋ฆฌ ๋น๊ต
์ค์ ๋ก 1000๊ฐ์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋ SADD
์ FADD
์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
$ SADD myset value1 value2 ... value1000
> (integer) 1000
$ MEMORY USAGE myset
> (integer) 48304
$ PFADD myhll value1 value2 ... value1000
> (integer) 1
$ MEMORY USAGE myhll
> (integer) 2104
ํ์ฉ ์ฌ๋ก
1. ๋ฐฉ๋ฌธ์ ์ ์ถ์
๋งค์ผ ์๋ฐฑ๋ง ๋ช
์ ๋ฐฉ๋ฌธ์๊ฐ ์๋ ์น์ฌ์ดํธ์ ๊ฒฝ์ฐ, ์ ์ฒด ๋ฐฉ๋ฌธ์ ์๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ HyperLogLog
๋ ๋งค์ฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ด ๊ฐ์ ์ถ์ ํ๋ ๋ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
GEO(Geospatial)
Redis
์ Geospatial
์ ์์น ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฟผ๋ฆฌ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ด๋ถ์ ์ผ๋ก Sorted Sets
์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ, Geohash
์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋์ ์๋๋ฅผ ์ธ์ฝ๋ฉํฉ๋๋ค.
GEOADD
์ง์ ๋ ํค์ ํ๋ ์ด์์ ์์น ์์(๊ฒฝ๋, ์๋ ์ด๋ฆ)๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ฐ ์์น๋ ๊ฒฝ๋
, ์๋
, ์ด๋ฆ
์์๋ก ์ง์ ๋ฉ๋๋ค.
$ GEOADD company 127.056945 37.413294 "Kakao" 126.978400 37.566500 "Naver"
> (integer) 2
GEODIST
๋ ์์น ์์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ฑฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก m(๋ฏธํฐ)
๋ก ๋ฐํ๋์ง๋ง, m(๋ฏธํฐ)
, km(ํฌ๋ก๋ฏธํฐ)
, mi(๋ง์ผ)
, ft(ํผํธ)
๋ก ๋จ์๋ฅผ ์
๋ ฅํ์ฌ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
$ GEODIST company "Kakao" "Naver"
> "8421.0275"
$ GEODIST companyHQs "Kakao" "Naver" km
> "8km"
GEOHASH
์ง์ ๋ ์์น ์์์ GeoHash
๊ฐ์ ๋ฐํํฉ๋๋ค. Geohash
๋ ์์น ์ ๋ณด๋ฅผ ์งง์ ๋ฌธ์์ด๋ก ํํํ ๊ฒ์
๋๋ค.
$ GEOHASH company "Kakao"
> "wydm4g2c1hrz"
GEOPOS
์ง์ ๋ ์์น ์์์ ๊ฒฝ๋
์ ์๋
๋ฅผ ๋ฐํํฉ๋๋ค.
$ GEOPOS company "Kakao"
> 1) 1) "127.05694484710693" 2) "37.41329383850098"
GEORADIUS
์ฃผ์ด์ง ์์น๋ฅผ ์ค์ฌ์ผ๋ก ์ง์ ๋ ๋ฐ๊ฒฝ ๋ด์ ์์น ์์๋ฅผ ๋ฐํํฉ๋๋ค. WITHDIST, WITHHASH
, WITHCOORD
์ต์
์ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ฆฌ
, Geohash
, ์ขํ
์ ํจ๊ป ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
$ GEORADIUS company 127.056945 37.413294 5 km WITHDIST
> 1) 1) "Kakao" 2) "0.0002"
GEORADIUSBYMEMBER
ํน์ ์์น ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง์ ๋ ๋ฐ๊ฒฝ ๋ด์ ๋ค๋ฅธ ์์น ์์๋ฅผ ๋ฐํํฉ๋๋ค. ์ฌ๊ธฐ์๋ GEORADIUS
์ ๋์ผํ ์ต์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ GEORADIUSBYMEMBER company "Kakao" 15 km
> 1) "Kakao" 2) "Naver"
ํ์ฉ ์ฌ๋ก
Redis
์ Geospatial
๋ช
๋ น์ด๋ค์ ์์น ๊ธฐ๋ฐ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ค์๊ฐ ์์น์ถ์ , ๊ทผ์ ์์น ๊ฒ์, ๊ฑฐ๋ฆฌ ๊ณ์ฐ ๋ฑ์ ๊ธฐ๋ฅ์ ์ํด ์ด ๋ช
๋ น์ด๋ค์ ํ์ฉํ ์ ์์ต๋๋ค.
BloomFilter
Bloom Filter
๋ ํ๋ฅ ์ ์๋ฃ ๊ตฌ์กฐ
๋ก์, ์ด๋ค ์์๊ฐ ์งํฉ ๋ด์ ์กด์ฌํ๋์ง ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ Bloom Filter
๋ ์์๊ฐ ์งํฉ ๋ด์ ์กด์ฌํ๋์ง๋ง ํ์ธํ ์ ์์ผ๋ฉฐ, ํด๋น ์์์ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
Bloom Filter
์ ์ฃผ์ ์ฅ์ ์ ๊ณต๊ฐ ํจ์จ์ฑ
๊ณผ ์๊ฐ ํจ์จ์ฑ
์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ ์์๋ค์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ํ์ง๋ง ํ๋ฅ ์ ์ธ ํน์ฑ ๋๋ฌธ์ false positive(์๋ ๋ฐ ์๋ค๊ณ ๋งํจ)
์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ฆ, ์ด๋ค ์์๊ฐ ์งํฉ ๋ด์ ์กด์ฌํ์ง ์์์๋ ์กด์ฌํ๋ค๊ณ ์๋ชป ํ๋จ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ false negative(์๋๋ฐ ์๋ค๊ณ ๋งํจ)
๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
Redis
์ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก Bloom Filter
์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ด์ฅํ๊ณ ์์ง ์์ผ๋ฉฐ, Redis ๋ชจ๋
์ ์ฌ์ฉํ์ฌ Bloom Filter
๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค. RedisBloom
์ด๋ผ๋ ๋ชจ๋์ด ์ด๋ฅผ ์ํด ์ ๊ณต๋ฉ๋๋ค.
BF.ADD
Bloom Filter
์ ํ๋ ์ด์์ ์์ดํ
์ ์ถ๊ฐํฉ๋๋ค.
$ BF.ADD myFilter "item1"
BF.MADD
Bloom Filter
์ ์ฌ๋ฌ ์์ดํ
์ ์ถ๊ฐํฉ๋๋ค.
$ BF.MADD myFilter "item1" "item2" "item3"
BF.EXISTS
Bloom Filter
์์ ํน์ ์์ดํ
์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
$ BF.EXISTS myFilter "item1"
BF.MEXISTS
Bloom Filter
์์ ์ฌ๋ฌ ์์ดํ
์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
$ BF.MEXISTS myFilter "item1" "item2"
ํ์ฉ ์ฌ๋ก
- ์ค๋ณต ์ ๊ฑฐ: ๋๋์ ๋ฐ์ดํฐ์์ ์ค๋ณต ์์ดํ ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์บ์ ๋ ์ด์ด: ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ง์ ์ ์ ๋น ๋ฅธ ๊ฒ์ฌ๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ ํผํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
'BackEnd๐ฑ > DB & SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] MVCC๋ฅผ ํตํ ์ ๊ธ์๋ ์ฝ๊ธฐ (7) | 2023.10.07 |
---|---|
[MySQL] ์ฌ์ฉ์ ์์ฑ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฐฉ๋ฒ (0) | 2023.10.06 |
MySQL์์ VARCHAR์ TEXT์ ์ฐจ์ด (1) | 2023.09.17 |
์ค๋ฌด์์ Redisson์ ์ฐ๊ฒฐํ๋ฉด์ ๊ฒช์ ๋ฌธ์ ์ ๋ค (2) | 2023.08.18 |
Docker ์ปจํ ์ด๋์ MariaDB ์ค์นํ๊ธฐ (4) | 2023.05.12 |
์ธ๋ฑ์ค๋ฅผ ์ํ๋ ์ฟผ๋ฆฌ๋ค (0) | 2023.03.23 |
๋๊ธ