Redis Data Types

Redis ์ž๋ฃŒ๊ตฌ์กฐ

Redis์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๊ทธ ํŠน์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ์•Œ์•„๋ณด์ž.

๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด๋„ ๊ฐ™์ด ๋‹ค๋ฃจ๊ณ , stream, pub/sub, hyperlog๋“ฑ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์ž.

Strings

String ํƒ€์ž…์€ Redis์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ type์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” Key-value ํ˜•์‹์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค.

Key์™€ value ๋ชจ๋‘ binary safe ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋„ key, value์˜ ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

127.0.0.1:6379> set somekey somevalue
OK
127.0.0.1:6379> get somekey
"somevalue"
  • ๊ฐ’์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 512MB์ด๋‹ค. (๊ฑฐ์˜ ์‹ ๊ฒฝ์“ธ ํ•„์š” ์—†์„ ๋“ฏ ํ•˜๋‹ค)

  • INCR, DECR, INCRBY ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Atomic counters(Thread safe counter)๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • APPEND ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด APPEND๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • GETRANGE, SETRANGE ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๊ฐ’์— ๋žœ๋ค ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

    • ๊ฐ’์˜ ์–ด๋А ์œ„์น˜๋“  ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์ œ

Append

127.0.0.1:6379> append somekey value
(integer) 14
127.0.0.1:6379> get somekey
"somevaluevalue"

INCR, DECR, INCRBY

127.0.0.1:6379> set counter 1
OK
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> decr counter
(integer) 1
127.0.0.1:6379> get counter
"1"

127.0.0.1:6379> incrby counter 3
(integer) 4

Lists

Lists๋Š” Linked List์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” Redis์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

๋”ฐ๋ผ์„œ ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— element๋ฅผ ์ถ”๊ฐ€ / ์‚ญ์ œ / ์กฐํšŒํ•˜๋Š” ๊ฒƒ์€ O(1)์˜ ์†๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ์ค‘๊ฐ„์˜ ํŠน์ • index ๊ฐ’์„ ์กฐํšŒํ•  ๋•Œ๋Š” O(N)์˜ ์†๋„๋ฅผ ๊ฐ€์ง€๋Š” ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ค‘๊ฐ„์— ์žˆ๋Š” index๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด Sorted Set์„ ์‚ฌ์šฉํ•˜์ž

LPUSH, LTRIM, LPOP, RPOP, RTRIM, RPUSH, LRANGE ๋“ฑ ๋งŽ์€ ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋‹ค.

์˜ˆ์ œ

127.0.0.1:6379> rpush mylist A
(integer) 1
127.0.0.1:6379> lpush mylist B
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "B"
2) "A"

LRANGE์˜ 0๊ณผ -1์€ ํŒŒ์ด์ฌ List์˜ ์ธ๋ฑ์Šค์™€ ๋น„๊ตํ•˜๋ฉด ๊ธฐ์–ตํ•˜๊ธฐ ํŽธํ•˜๋‹ค.

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"
127.0.0.1:6379> rpop mylist 1
1) "C"
127.0.0.1:6379> lrange mylist 0 -1
1) "B"
2) "A"

LTRIM๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ Lists์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

127.0.0.1:6379> lpush mylist D
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "D"
2) "C"
3) "B"
4) "A"
127.0.0.1:6379> ltrim mylist 0 2
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "D"
2) "C"
3) "B"

Sets

Redis sets๋Š” ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” Strings์˜ ์ง‘ํ•ฉ์ด๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๊ฐ€, ์‚ญ์ œ, element์˜ ์กด์žฌ ์œ ๋ฌดํ™•์ธ ๋“ฑ์— ๋Œ€ํ•ด์„œ O(1)์˜ ์†๋„๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

๋˜ํ•œ Set ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ value๋Š” ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด์„œ 2๊ฐœ๊ฐ€ ๊ณต์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , ๋น ๋ฅธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์–ด์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ Sets๋Š” Sets๊ฐ„์˜ ํ•ฉ์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ ๋“ฑ์„ ์ง€์›ํ•ด์ค€๋‹ค.

Set์˜ ๋ช…๋ น์–ด๋Š” sadd, smembers ๋“ฑ์ด ์žˆ๋‹ค.

127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> spop myset 1
1) "1"
127.0.0.1:6379> srandmember myset 1
1) "3"
127.0.0.1:6379> smembers myset
1) "2"
2) "3"

Hashes

Redis์˜ Hashes๋Š” value๋กœ ๋˜ ๋‹ค๋ฅธ key-value Map์„ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

127.0.0.1:6379> hmset primrose name primrose birth 1996 superuser true
OK
127.0.0.1:6379> hget primrose name
"primrose"
127.0.0.1:6379> hget primrose birth
"1996"
127.0.0.1:6379> hgetall primrose
1) "name"
2) "primrose"
3) "birth"
4) "1996"
5) "superuser"
6) "true"

Sorted sets

Redis์˜ Sorted sets ์ž๋ฃŒ๊ตฌ์กฐ๋Š” Sets ์ž๋ฃŒ๊ตฌ์กฐ์— Score๋ฅผ ์ถ”๊ฐ€๋กœ ๊ธฐ๋กํ•˜์—ฌ Score๊ฐ€ ๋‚ฎ์€์ˆœ์„œ๋ถ€ํ„ฐ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

๋™์ผํ•œ ๊ฐ’(Key)์€ ์˜ค์ง€ ๋ชปํ•˜๋ฉฐ Score(Value)๋Š” ๋™์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

127.0.0.1:6379> zadd hackers 1940 "Alan Kay"
(integer) 1
127.0.0.1:6379> zadd hackers 1957 "Sophie"
(integer) 1
127.0.0.1:6379> zadd hackers 1953 "Richard"
(integer) 1
127.0.0.1:6379> zadd hackers 1949 "Anita"
(integer) 1
127.0.0.1:6379> zadd hackers 1965 "Yuki"
(integer) 1
127.0.0.1:6379> zadd hackers 1914 "Hedy"
(integer) 1
127.0.0.1:6379> zadd hackers 1916 "Calude"
(integer) 1
127.0.0.1:6379> zadd hackers 1969 "Linus"
(integer) 1
127.0.0.1:6379> zadd hackers 1912 "Turing"
(integer) 1
127.0.0.1:6379> zrange hackers 0 -1
1) "Turing"
2) "Hedy"
3) "Calude"
4) "Alan Kay"
5) "Anita"
6) "Richard"
7) "Sophie"
8) "Yuki"
9) "Linus"
127.0.0.1:6379> zrange hackers 0 3
1) "Turing"
2) "Hedy"
3) "Calude"
4) "Alan Kay"

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŠน์ • Member์˜ ์ˆœ์œ„๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

127.0.0.1:6379> zrank hackers Turing
(integer) 0
127.0.0.1:6379> zrank hackers Yuki
(integer) 7

Stream

Redis 5.0์— ์ƒˆ๋กญ๊ฒŒ ๋„์ž…๋œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด๋‹ค.

์ด ๊ธ€์€ ์‚ฌ์‹ค์ƒ Stream์„ ์œ„ํ•ด ์“ฐ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์กฐ๊ธˆ ์ƒ์„ธํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.

127.0.0.1:6379> xadd primrose * name "primrose"
"1676829361208-0"

์ผ๋‹จ XADD ๋ช…๋ น์–ด๋กœ ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

*์„ ์ด์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ID๋ฅผ ๋ถ€์—ฌํ•ด์ฃผ๊ณ , ์ด ID๋Š” milliseconds - sequence์˜ ํ˜•ํƒœ๋กœ ๋‚˜์˜จ๋‹ค.

ํ˜„์žฌ ์‹œ๊ฐ„์˜ timestamp ์ˆซ์ž์™€ ๊ฐ™์€ ์‹œ๊ฐ„๋‚ด์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— numbering์ด ๋˜์–ด์žˆ๋‹ค.

127.0.0.1:6379> xadd primrose * name "primrose"
"1676829361208-0"
127.0.0.1:6379> xadd primrose * name "primrose"
"1676829496497-0"
127.0.0.1:6379> xlen primrose
(integer) 2

์ด์ œ XREAD๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ์–ด๋ณด์ž.

127.0.0.1:6379> xread block 5000 streams primrose $

$๋Š” ๋‹ค์–‘ํ•œ ๋œป์ด ์žˆ๋‹ค. jsonpath ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์œผ๋กœ๋„ ์“ฐ์ด๊ณ  $123 ์€ 123bytes๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๋œป์œผ๋กœ ์“ฐ์ด๊ธฐ๋„ ํ•˜๊ณ  ์—ฌ๊ธฐ์„œ๋Š” ์ƒˆ๋กœ ์ƒ๊ธด streams data๋งŒ ๋ฐ›๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

127.0.0.1:6379> xread block 5000 streams primrose $
1) 1) "primrose"
   2) 1) 1) "1676829720128-0"
         2) 1) "id"
            2) "100"
(1.49s)
127.0.0.1:6379> xread block 5000 streams primrose $
1) 1) "primrose"
   2) 1) 1) "1676829731446-0"
         2) 1) "id"
            2) "200"

์œ„์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ XADD ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด XREADํ•˜๋˜ ํ„ฐ๋ฏธ๋„์—์„œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๋‹ค์Œ์€ XGROUP์ด๋‹ค. ๋ ˆ๋””์Šค ํ‚ค์™€ ํ•จ๊ป˜ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

127.0.0.1:6379> xgroup create newstream mygroup $ MKSTREAM
OK

๋‹ค์‹œ ์ŠคํŠธ๋ฆผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

127.0.0.1:6379> xadd mystream * message apple
"1676830015352-0"
127.0.0.1:6379> xadd mystream * message banana
"1676830020324-0"
127.0.0.1:6379> xadd mystream * message orange
"1676830024374-0"
127.0.0.1:6379> xadd mystream * message strawberry
"1676830027779-0"
127.0.0.1:6379> xadd mystream * message apricot
"1676830032520-0"

๋‹ค์Œ๊ณผ ๊ฐ™์ด XRANGE ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ ์ŠคํŠธ๋ฆผ์— ๋‹ด๊ฒจ์žˆ๋Š” ์ „์ฒด ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

-, + ๋ถ€๋ถ„์—๋Š” Entry ID๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, -๋ž‘ +๋กœ ํ•˜๋ฉด ๊ฐ€์žฅ ์ž‘์€ ์•„์ด๋””๋ถ€ํ„ฐ ๊ฐ€์žฅ ํฐ ์•„์ด๋””๊นŒ์ง€ ๋ณด์—ฌ์ค€๋‹ค.

127.0.0.1:6379> xrange newstream - +
(empty array)

์ด์ œ ๊ทธ๋ƒฅ READ๊ฐ€ ์•„๋‹ˆ๋ผ XGROUPREAD๋ฅผ ํ•ด๋ณด์ž.

127.0.0.1:6379> xreadgroup group mygroup Alice count 1 streams newstream >
1) 1) "newstream"
   2) 1) 1) "1676830550872-0"
         2) 1) "message"
            2) "apple"
  • <group-name> <consumer-name> ์ˆœ์„œ๋Œ€๋กœ ๋ช…์‹œํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์—ฌ๊ธฐ ์˜ˆ์ œ์—์„œ group-name์€ mygroup, consumer-name์€ Alice๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

  • ๋์— > ๋Š” ๋‹ค๋ฅธ ์†Œ๋น„์ž์—๊ฒŒ ์ „๋‹ฌ๋œ ์ ์ด ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ˆ˜ ID

๋งŒ์•ฝ ์ŠคํŠธ๋ฆผ์„ ๋ฐ”๋ผ๋ณด๊ณ  ๋Œ€๊ธฐํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด BLOCK <millisecondsTime> ์„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

127.0.0.1:6379> XREADGROUP GROUP mygroup Alice BLOCK 2000 COUNT 1 STREAMS newstream >
1) 1) "newstream"
   2) 1) 1) "1676830563238-0"
         2) 1) "message"
            2) "strawberry"

์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

127.0.0.1:6379> xreadgroup group mygroup Alice streams newstream 0
1) 1) "newstream"
   2) 1) 1) "1676830550872-0"
         2) 1) "message"
            2) "apple"
      2) 1) "1676830558321-0"
         2) 1) "message"
            2) "orange"
      3) 1) "1676830563238-0"
         2) 1) "message"
            2) "strawberry"

Last updated