TIL

4장 레디스 자료 구조 활용 사례

sorted set을 이용한 실시간 리더보드

> ZADD daily-score:220817 28 player:286
(integer) 1

> ZADD daily-score:220817 400 player:234
(integer) 1
> 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
# 원래 245였다면 345로 업데이트
ZINCRBY daily-score:220817 100 player:24

랭킹 합산

> 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 weekly-score:2208-3 3 daily-score:220815 
daily-score:220816 daily-score:220817 weights 1 2 1
(integer) 4

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

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 tag:IT:posts tag:DataStore:posts
1) "47"

랜덤 데이터 추출

> HRANDFILED user:hash
"Id:4615"

# COUNT 옵션으로 원하는 개수만큼 랜덤 아이템을 반환할 수 있다.
# COUNT 옵션을 양수로 설정하면 중복 없는 랜덤, 음수는 중복 있는 랜덤이 반환
> HRANDFILED user:hash 2
1) "Id:4615"
2) "Id:134"

레디스에서의 다양한 카운팅 방법

좋아요 처리하기

# 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

DAU 구하기

# 2022-11-06에 유저 id=14를 방문 처리
> SETBIT uv:20221106 14 1
(integer) 0

# 해당 일자 접근 유저 수 확인
>BITCOUNT uv:20221106
(integer) 3
# 특정 기간 동안 매일 방문한 사용자 구하기
# 연속 출석 유저 정보를 새로운 비트맵인 event:202211에 저장
> BITOP AND event:202211 uv:20221101 uv:20221102 uv:20221103
(integer) 2

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

Geospatial Index를 이용한 위치 기반 애플리케이션 개발

위치 데이터란

레디스에서의 위치 데이터

# 142 유저의 현재 위치를 저장
> GEOADD user 50.2342452353 14.4235423546t 142