본문 바로가기
프로그래밍/데이터베이스

Redis 자료구조(Data Structures)

by bantomak 2023. 5. 30.

Redis 자료구조

  • Strings : Binary-safe 한 기본적인 key-value 구조
  • Lists : 삽입 순서에 따라 정렬된 문자열 요소 컬렉션을 보유
  • Sets : 고유한 멤버 집합을 저장
  • Sorted sets : 부동 소수점 점수로 정렬된 고유한 멤버 집합
  • Hashes : 내부에 sub-key - value를 하나 더 가지는 데이터 구조
  • Bit arrays(bitMaps) : Binary 로직과 상태를 저장하는 압축 데이터 구조
  • HyperLogLogs : 일정한 메모리 크기에서 고유 값을 계산하는 데 사용되는 확률적 데이터 구조
  • Streams : 고속 데이터 스트림(예:메시지 대기열)을 관리하기 위한 데이터 구조

redis의 자료구조들

Strings

  • 값은 최대 512mb
  • 단순 증감 연산에 좋음
  • 명령어 리스트 : set, get, mset, mget, incr, decr, incrby, decrby
127.0.0.1:6379> set temp tt

127.0.0.1:6379> get temp
"tt"

127.0.0.1:6379> keys *
"temp"

// type 명령어로 타입 확인
127.0.0.1:6379> type temp
"string"

binary-safe 문자열이란?

  • 데이터의 손실없이 null 바이트를 포함한 모든 byte 시퀀스를 저장, 처리, 조작할 수 있는 문자열 처리 방식
  • 인코딩에 특화된 문자열을 읽는 것이 아니라 원시(raw) 바이트를 그대로 다룬다.
  • 원시 바이트를 그대로 다루기 때문에 텍스트뿐만 아니라 이미지, 오디오, 직렬화된 객체 등의 처리도 가능하다.

binary-safe 하지 않다는 것은 무엇일까?

  • 특정 인코딩(ASCII, UTF-8)으로 문자열을 다룬다.
  • 특정 바이트 시퀀스가 특수 문자로 다뤄지거나 유효하지 않은 인코딩으로 다뤄져 바이너리 데이터를 저장하거나 조작하는 경우 문제가 발생할 수 있다.

binary-safe in redis

  • text, number, binary data 등을 인코딩 걱정 없이 저장할 수 있다.

Lists

  • array 형식의 데이터 구조, 데이터를 순서대로 저장
  • 추가 / 조회 / 삭제하는 것은 O(1)의 속도를 가지지만, 중간 특정 index 값을 조회할 때는 O(n)의 속도를 가지는 단점이 있음
  • Message queue로 사용하기에 적절하다.
  • 명령어 리스트 : lpush, rpush, lpushx, rpushx, lrange, lindex, llen, lpop, rpop, lrem, ltrim

 

Sets

  • 중복된 데이터를 담지 않기 위해 사용하는 자료구조
  • 유니크한 key값
  • 정렬되지 않은 집합
  • 중복된 데이터를 여러 번 저장하면 최종 한 번만 저장된다.
  • 명령어 리스트 : sadd, smove, smembers, scard, srandmember, sismember, sscan, spop, srem

 

Sorted Sets

  • set에 score라는 필드가 추가된 데이터 형태
  • 일반적으로 set은 정렬이 되어있지 않고 insert 한 순서대로 들어간다.
    그러나 sorted set은 set은 set의 특성은 그대로 가지며 추가적으로 저장된 멤버들의 순서도 관리한다.
  • 데이터를 저장할때부터 score 순으로 정렬되어 저장
  • 오름차순으로 내부 정렬
  • 명령어 리스트 : zadd, zrange, zrangebyscore, zrangebylex, zpopmin, zpopmax, zrem, zincrby

 

Hashes

  • field-value로 구성되어 있는 전형적인 hash 형태
  • key 하위에 subkey를 이용해 추가적인 Hash Table을 제공하는 자료구조
  • 명령어 리스트 : hset, hmset, hsetnx, hget, hmget, hlen, hkeys, hvals, hdel, hincrby, hincrbyfloat

 

# 한개 값 삽입 및 삭제
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"

 

Bitmaps

  • bitmaps은 string의 변형
  • bit 단위로 연산 가능
  • String이 512mb 저장할 수 있듯이 232bit까지 사용 가능하다.
  • 명령어 리스트 : getbit, setbit, bitcount, bitop, bitpos

댓글