sorted set
을 사용하면 데이터는 정렬돼 들어간다.> ZADD daily-score:220817 28 player:286
(integer) 1
> ZADD daily-score:220817 400 player:234
(integer) 1
ZRANGE
커맨드로 스코어가 낮은 순서부터 출력 가능하고 ZREVRANGE
커맨드로 잘라서 조회할 수 있다.
ZREVRANGE
은 내림차순> ZREVRANGE daily-score:220817 0 2 withscores
1) "player:234"
2) "400"
3) "player:24"
4) "357"
5) ...
ZADD daily-score:220817 200 player:286
ZINCRBY
커맨드로 입력값만큼 증가시킬 수도 있다.# 원래 245였다면 345로 업데이트
ZINCRBY daily-score:220817 100 player:24
ZUNIONSTORE
커맨드로 쉽게 구현할 수 있다.
ZUNIONSTORE
- 지정한 키에 연결된 각 아이템의 스코어를 합산하는 커맨드ZUNIONSTORE
는 <생성할 키 이름><합산할 키 개수><합산할 키>…
와 같이 사용할 수 있다.> ZUNIONSTORE weekly-score:2208-3 3 daily-score:220815 daily-score:220816 daily-score:220817
(integer) 4
# 합산된 데이터 순으로 정렬
> ZREVRANGE weekly-score:2208-3 0 -1 withscores
1) "player:24"
2) "650"
3) ...
ZUNIONSTORE
로 데이터를 합칠 때 가중치를 줄 수도 있다.
> ZUNIONSTORE weekly-score:2208-3 3 daily-score:220815
daily-score:220816 daily-score:220817 weights 1 2 1
(integer) 4
SELECT * FROM keyword WEHRE user_id = 123 ORDER BY req_date DESC LIMIT 5
keyword
테이블을 관리하려면 중복 제거, 주기적으로 오래된 기록 삭제 작업 등이 필요하다.sorted set
을 사용하면 관리 포인트가 크게 줄어든다.
# 데이터 저장 (검식 일시를 스코어로 사용)
> ZADD search-keyword:123 20221106143501 코듀로이
(integer) 1
# 데이터 조회 (최근 5개 조회)
> ZREVRANGE search-keyword:123 0 4 withscores
# 음수 인덱스로 6번째로 오래된 기록 삭제
# 데이터가 6개가 됐을 때 가장 오래전 저장된 데이터는 인덱스 0, 음수로 하면 -6이다.
> ZREMRANGEBYRANK search-keyword -6 -6
tag
, post_tag
set
을 사용하면 간단하게 태그 기능을 구현할 수 있다.
> SADD post:47:tags REDIS DataStore IT
(integer) 3
> SADD tag:REDIS:posts 47
1
> SADD tag:DataStore:posts 47
1
> SADD tag:IT:posts 47
1
> SMEMBERS tag:IT:posts
1) "22"
2) "47"
3) "53"
SINTER
커맨드로 2개 이상의 태그에 속하는 게시글을 조회할 수 있다.
> SINTER tag:IT:posts tag:DataStore:posts
1) "47"
ORDER BY RAND()
함수를 많이 사용한다.
RANDOMKEY
커맨드는 레디스의 전체 키 중 하나를 무작위로 반환한다.
hash
, set
, sorted set
등은 여러 데이터를 한 키에 저장HRANDFIELD
, SRANDMEMBER
, ZRANDMEMBER
는 각각 hash
, set
, sorted set
에 저장된 아이템 중 랜덤한 값을 추출한다.> HRANDFILED user:hash
"Id:4615"
# COUNT 옵션으로 원하는 개수만큼 랜덤 아이템을 반환할 수 있다.
# COUNT 옵션을 양수로 설정하면 중복 없는 랜덤, 음수는 중복 있는 랜덤이 반환
> HRANDFILED user:hash 2
1) "Id:4615"
2) "Id:134"
set
으로 좋아요 로직을 간단히 구현할 수 있다.
set
을 생성set
에 저장# 12554 댓글에 유저:967이 좋아요를 누름
> SADD comment-like:12554 967
# 댓글별 좋아요 누른 수
> SCARD comment-like:12554
(integer) 3
# user:234가 4234 채널에 새로운 메시지 수신
> HINCRBY user:234 channel:4234 1
(integer) 1
# 누군가 메시지를 삭제했다면
> HINCRBY user:234 channel:4234 -1
(integer) 26
hash
구조는 객체 구조에서 카운트를 효과적으로 관리할 수 있는 방법이다.set
에 저장할 수도 있다.
string
자료 구조에 bit 연산이 가능하도록 구현됨string
최대 길이는 512MB이기에 하나의 키로 천만 사용자는 문제 없다.# 2022-11-06에 유저 id=14를 방문 처리
> SETBIT uv:20221106 14 1
(integer) 0
# 해당 일자 접근 유저 수 확인
>BITCOUNT uv:20221106
(integer) 3
BITOP
커맨드로 AND, OR, XOR, NOT 연산을 할 수 있다.# 특정 기간 동안 매일 방문한 사용자 구하기
# 연속 출석 유저 정보를 새로운 비트맵인 event:202211에 저장
> BITOP AND event:202211 uv:20221101 uv:20221102 uv:20221103
(integer) 2
hyperloglog
사용을 고려할 수 있다.
hyperloglog
를 이용해 유저의 월별 api 호출 횟수를 계산하는 방법이다.
hyperloglog
에 저장할 수 있다.# 2022-11에 userID=245인 유저의 호출 횟수 계산
> PFADD 202211:user:245 49483
(integer) 1
> PFADD 202211:user:245 32714
(integer) 1
> PFADD 202211:user:245 49483
(integer) 1
# 중복되지 않은 데이터 개수 확인
> PFCOUNT 202211:user:245
(integer) 2
hyperloglog
는 set
과 비슷하지만 용량은 12KB로 고정된다.PFMERGE
커맨드로 여러 hyperloglog
를 합칠 수 있어 합산 데이터를 간단히 계산할 수 있다.geo
자료 구조로 공간 정보 데이터를 처리할 수 있다.
geo set
과 pub/sub을 함께 사용한다면 특정 이벤트를 해당 지역 근처 사용자에게 실시간 알림을 보낼 수도 있다.geo set
은 공간 관리에 특화된 데이터로 내부적으로 sorted set
으로 저장된다.# 142 유저의 현재 위치를 저장
> GEOADD user 50.2342452353 14.4235423546t 142
GEOPOS
- 저장된 데이터의 경도, 위도를 조회GEOSEARCH
- 일정 공간 범위 내 키값을 조회 (ex. 주변 맛집 검색)