# 유효 시간(초) 설정 (EX) SET mykey "Hello" PX 10000 # 유효 시간(밀리초) 설정 (PX) SET mykey "Hello" EXAT 1672531199 # 특정 유닉스 시간(초)까지 유효 (EXAT) SET mykey "Hello" PXAT 1672531199123 # 특정 유닉스 시간(밀리초)까지 유효 (PXAT) SET mykey "Hello" KEEPTTL # TTL을 유지하면서 값을 업데이트 (KEEPTTL)
자료구조 명령어
Redis 에서 사용 가능한 자료구조 LIST, HASH, SET, ZSET 에서 사용 가능한 명령어 들
만약 key 를 그룹화하고 해당 그룹의 모든 key 를 검색하는 작업을 수행해야 한다면 자료구조를 이용해야 한다. KEYS 나 SCAN 명령을 사용하면 redis 의 전체조회가 일어나기에 그룹화를 사용해야 한다면 HASH, ZSET 을 통해 관리한다.
요소별로 TTL 은 설정할 수 없으며, TTL 관리가 필요한 요소의 경우 timestamp 를 문자열뒤에 붙이거나 값과 같이 저장해야한다.
list 명령어
stack, queue 의 기능을 지원함.
LPUSH, RPUSH, LRANGE, LPOP, RPOP
1 2 3 4 5 6
LPUSH <key> <value1> ... <valueN> # list 왼쪽에 value 추가 RPUSH <key> <value1> ... <valueN> # list 오른쪽에 value 추가 LRANGE <key> <start> <end> # index range 읽기
LPOP <key> # list 왼쪽에서 value 삭제 RPOP <key> # list 오른쪽에서 value 삭제
LPOS <key> <element> [options] # 찾고자 하는 요소 인덱스를 반환
LINSERT <key> BEFORE|AFTER <pivot> <value> # pivot 요소 앞 혹은 뒤에 value 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
RPUSH mylist "a""b""c"# (integer) 3 LINSERT mylist BEFORE "b""x"# (integer) 4 LINSERT mylist AFTER "a""y"# (integer) 5 LRANGE mylist 0 -1 # 1) "a" # 2) "y" # 3) "x" # 4) "b" # 5) "c"
RPUSH mylist "apple""banana""cherry""banana""date" LPOS mylist "banana"# (integer) 1 LPOS mylist "banana" COUNT 2 # 1) "1" , 2개 요소 검색 # 2) "3" LPOS mylist "banana" RANK 2 # (integer) 3, RANK 이후부터 검색 LPOS mylist "orange"# (nil)
hash 명령어
해시에 들어가는 요소의 개수가 많거나 hash 형의 장점인 내부 인코딩의 메모리 압축을 제대로 활용하지 못한다. 그리고 hash 특성상 O(N) 시간복잡도를 가지는 함수가 여럿 있는데, 싱글스레드로 동작하는 Redis 에게 delay 를 유발함으로 hash 의 크기를 작게 관리하거나 사용에 유의해야한다.
ZADD key [ NX | XX ] [ GT | LT ] [ CH ] [ INCR ] score member [ score member ...]
ZADD 함수의 반환값 기존 요소를 변경할 경우 (integer) 0, 새로운 요소 추가할 경우 (integer) N 이다.
1 2 3 4 5 6 7 8 9 10 11 12 13
ZADD myzset 1 member1 2 member2 3 member3 4 member4 # (integer) 4 # member 가 존재하지 않을 때에만 실행 ZADD myzset NX 400 member4 # (integer) 1 # member 가 존재할 때에만 실행 ZADD myzset XX 400 member4 # (integer) 0, 실행되건 되지 않건 항상 0이다.
# 입력 숫자가 기존 점수보다 클 경우에만 추가, 새로운 요소 추가가능 ZADD myzset GT 200 member2 # 입력 숫자가 기존 점수보다 낮을 경우에만 추가, 새로운 요소 추가가능 ZADD myzset LT -2 member2
# 입력 숫자만큼 score 증가 ZINCRBY myzset 100 member1 # "101"
1 2 3 4 5 6
# member 를 무작위로 가져오기 # ZRANDMEMBER key [count [WITHSCORES]] ZADD myzset 1 a 2 b 3 c 4 d 5 e 6 f 7 g # (integer) 7 ZRANDMEMBER myzset # "a" ZRANDMEMBER myzset 2 # 1) "b" # 2) "g"
ZCARD ZCOUNT ZLEXCOUNT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ZADD myzset 1 a 2 b 3 c 4 d 5 e 6 f 7 g # (integer) 7
# member 개수 반환 ZCARD myzset # (integer) 7
# min max 사이 해당 score 의 member 개수 반환 # ZCOUNT key min max ZCOUNT myzset 1 3 # (integer) 3, 1이상 3이하 ZCOUNT myzset (1 3 # (integer) 2, 1초과 3이하 ZCOUNT myzset 1 (3 # (integer) 2, 1이상 3미만 ZCOUNT myzset (1 (3 # (integer) 1, 1초과 3미만
# ZLEXCOUNT key min max # 사전 기준 min max 사이 member 개수 반환 ZLEXCOUNT myzset [b [f # (integer) 5
ZADD myzset 1 a 2 b 3 c 4 d 5 e 6 f 7 g # (integer) 7
# ZREMRANGEBYLEX key min max # member 의 사전 min max 기준 삭제 ZREMRANGEBYLEX myzset [b [d # (integer) 3 ZRANGE myzset 0 -1 # 1) "a" # 2) "e" # 3) "f" # 4) "g"
# ZREMRANGEBYRANK key start stop # rank 의 start stop 정렬 인덱스 기준 삭제, ZADD myzset 1 one 2 two 3 three 4 four 5 five # (integer) 5 ZREMRANGEBYRANK myzset 1 3 # (integer) 3 ZRANGE myzset 0 -1 # 1) "one" # 2) "five"
# ZREMRANGEBYSCORE key min max # score 의 start stop 정렬 score 기준 삭제 ZADD myzset 1 one 2 two 3 three 4 four 5 five # (integer) 5 ZREMRANGEBYSCORE myzset 1 3 # (integer) 3 ZRANGE myzset 0 -1 # 1) "four" # 2) "five"
zset 명령어 - 집합
set 집합 명령어에서 제공했던 차집합, 교집합, 합집합에 대한 함수를 제공한다.
ZDIFF
ZDIFFSTORE
ZINTER
ZINTERSTORE
ZUNION
ZUNIONSTORE
SINTERCARD
사용방법은 set 집합 명령어와 동일하니 위에 참고
ZMPOP
여러개의 집합에서 score 를 비교하여 count 만큼 꺼낼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13
# ZMPOP numkeys key [ key ...] < MIN | MAX > [ COUNT count ]
중간에 실패할만한 명령어를 껴놓으면 실행전에 실패 가능성을 알 수 있기 때문에 전체 트랜잭션을 실행시키지 않는다.
1 2 3 4 5 6 7 8
MULTI # "OK" SET bar 10 # "QUEUED" INCR bar # "QUEUED" UNKNOWN bar # "ERR unknown command 'UNKNOWN' ... INCR bar # "QUEUED" GET bar # "QUEUED" EXEC # "EXECABORT Transaction discarded because of previous errors." GET bar # (nil)
정상적인 명령어지만 논리적으로 실패하는 경우(ex: 문자열을 1 증가) 트랜잭션은 실행된다. 명령 실행 원자성만 보장할 뿐 롤백은 되지 않는다.
1 2 3 4 5 6 7 8 9 10 11
SET bar 10 # "OK" MULTI # "OK" INCR bar # "QUEUED" SET bar "hello"# "QUEUED" INCR bar # "QUEUED" GET bar # "QUEUED" EXEC # 1) "11" # 2) "OK" # 3) "ReplyError: ERR value is not an integer or out of range" # 4) "hello" GET bar # hello