[Redis] Redis(레디스) 자료구조

2023. 2. 5. 16:47·Study/DB

Redis 데이터 타입 (Collection)


Redisd의 장점 중 하나는 Key-value 스토리지에서 Value는 단순한 Object가 아니라 다양한 자료구조를 갖기 때문이다.

String, Set, Sorted Set, Hash, List 등 다양한 타입을 지원한다.

이번 시간에는 각 레디스의 자료구조를 알아보고 자료구조를 이용하는 명령어(command)를 정리해보는 시간을 가져보겠다.

Redis Collections 를 사용할 때 주의점

하나의 컬렉션에 너무 많은 아이템을 담으면 좋지 않다.
가능하면 10000개 이하의, 몇천개 수준의 데이터 셋을 유지하는게 Redis 성능에 영향을 주지 않는다.

 


Redis - Strings

  • 일반적인 문자열
  • 값은 최대 512MB이며, 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, LSETM, LINSERT, RPOPLPUSH
  • GET : LRANGE, LINDEX, LLEN
  • POP : LPOP, RPOP, BLPOP, BRPOP
  • REM : LREM, LTRIM
  • BLOCK : BLPOP, BRPOP, BRPOPLPUSH
  • Entreprise : LREVRANGE, LPLUSHS, 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) 서브쿼리로 데이터를 저장

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>
Copy
# 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, SDIFFTORE
  • 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 CLI 명령어 정리

명령어 예시 설명
keys keys * 적재되어 있는 key 확인
SELECT SELECT1 DB 조회 (1~15까지 DB가 정해져있음 0이 default)
exists keys key1 key가 존재하는지 확인 (존재하면 1 없으면 0)
RANDOMKEY RANDOMKEY 랜덤으로 key를 조회
type type key1 key의 type을 조회함 (string이면 string으로 반환)
set 
set key1 value1 key / value 형태로 데이터 저장하기 
mset  mset key1 value1 key2 value2 key / value 형태로 데이터를 여러개 저장하기
setex  setex key1 10 value1 소멸시간 지정해서 저장하기 
get  get key1 key에 해당하는 value 조회 
mget  mget key1 key2 여러개 key로 value 조회
hget hget key1 field1 hash로 저장된 값의 필드 하나를 조회
del  del key1 key에 해당하는값 삭제
getdel  getdel key1 key에 해당하는 value를 가져온 후 삭제
ttl  ttl key1 남은 시간을 초단위로 변환 (-1이면 사라지지 않은 키)
pttl  pttl key1 남은 시간을 밀리초 단위로 변환
keys  keys *key* 지정된 패턴으로 key를 검색
rename  rename key1 key1_r key 이름 변경하기
DBSIZE DBSIZE 레디스 서버에 있는 key의 전체 개수
flushall flushall 모든 데이터 삭제

 

'Study > DB' 카테고리의 다른 글

[Mongo] 몽고(mongoDB)디비 CRUD 쿼리 문법 명령어 정리  (0) 2023.02.15
[DB] 데이터베이스 기초 개념  (0) 2023.02.08
[DBMS] Redis(레디스)란? - 6  (0) 2023.01.22
[DBMS] Redis(레디스)란? - 5  (0) 2023.01.21
[DBMS] Redis(레디스)란? - 4  (0) 2023.01.19
'Study/DB' 카테고리의 다른 글
  • [Mongo] 몽고(mongoDB)디비 CRUD 쿼리 문법 명령어 정리
  • [DB] 데이터베이스 기초 개념
  • [DBMS] Redis(레디스)란? - 6
  • [DBMS] Redis(레디스)란? - 5
개발새발개발
개발새발개발
  • 개발새발개발
    끄저억끄저억
    개발새발개발
  • 전체
    오늘
    어제
    • 분류 전체보기 (57)
      • Study (45)
        • DB (9)
        • WEB (11)
        • Spring (14)
        • JS (5)
        • Python (2)
        • IntelliJ (4)
      • 이슈 해결 (2)
      • Challenge (4)
        • 구름톤 챌린지 (3)
        • 자격증 (0)
      • 우아한테크코스 (2)
      • Dev Camp 3기 (0)
      • 개발 Tip (3)
      • 일상 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    레디스
    스프링
    IntelliJ
    NULL
    web
    우테코
    realforce r3
    JPA
    Spring
    객체지향
    Java
    singleton
    db
    우아한테크코스
    DBMS
    싱글톤
    jwt
    til
    Redis
    김영한
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발새발개발
[Redis] Redis(레디스) 자료구조
상단으로

티스토리툴바