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 |