레디스 자료 구조 활용 사례
- 레디스 자료구조에 내장된 함수를 이용해 원하는 기능을 구현하면 데이터를 애플리케이션의 메모리 영역으로 가져와 가공하는데 걸리는 시간을 아낄수 있음
- 때문에 레디스가 제공하는 자료구조를 적절히 활용한다면 성능면에서 최적화 가능
sorted set을 이용한 실시간 리더보드
- 리더보드의 두 가지 유형
- 절대적 리더보드
- 상대적 리더보드
- 유저와 인접해있는 스코어를 보여주는 리더보드
- 특정 그룹 내에서의 순위를 보여주는 리더보드
- 일별 리더보드
daily-score:<날짜>
의 키값을 이용
> ZADD daily-score:240807 90 player:120
> ZADD daily-score:240807 100 player:110
> ZADD daily-score:240807 80 player:130
// 전체 조회
> ZRANGE daily-score:240807 0 -1 withscores
// 상위 3개
> ZREVRANGE daily-score:240807 0 2 withscores
// 스코어 증가
// player:110 플레이어의 점수를 10점올림
> ZINCRBY daily-score:240807 10 player:110
> ZUNIONSCORE weekly-score:2408-02 daily-score:240807 daily-score:240808 daily-score:240809
sorted set을 이용한 최근 검색 기록
- 요구사항
- 유저별 최근 검색어 관리
- 중복 검색어 제거
- 최근 n개의 검색어 노출
- 추가
ZADD search-keyword:<userId> <날짜> <키워드>
- 조회 (최근 5개 조회)
ZREVRANGE search-keyword:<userId> 0 4 withscores
- 동일한 데이터를 다시 입력하면 날짜(스코어)만 업데이트됨
- 최근 5개의 데이터만 유지
ZREMRANGEBYRANK key start stop
커맨드 사용ZREMRANGEBYRANK search-keyword:<userId> -6 -6
set을 이용한 태그 기능
// 셋에다가 3개 태그 입력
> SADD post:47:tags IT REDIS DataStore
// 태그에다 포스트 식별자 입력
> SADD tag:IT:posts 47
> SADD tag:REDIS:posts 47
> SADD tag:DataStore:posts 47
// 태그에 해당하는 게시글 조회
> SMEMBERS tag:IT:posts
// 두 태그의 공통 게시글 조회
> SINTER tag:ID:posts tag:REDIS:posts
랜덤 데이터 추출
- hash: HRANDFIELD
- set: SRANDMEMBER
- sorted set: ZRANDMEMBER
레디스에서의 다양한 카운팅 방법
- 좋아요 처리하기
- set을 사용
SADD post:<id>:like <userId>
SCARD post:<id>:like
- 읽지 않은 메시지 수 카운팅하기
- DAU 구하기
- hyperloglog를 이용한 애플리케이션 미터링