리더보드는 사용자의 스코어 기반으로 데이터를 정렬하는 서비스
sorted set 에서 데이터를 저장할때에는 ZADD 커맨드를 사용한다
ZADD daily-score:220817 28 player:286
ZADD daily-score:220817 400 player:234
순서 없이 데이터를 저장하더라도 sorted set에는 데이터 스코어 순으로 저장된다
ZRANGE 커맨드를 이용하면 스코어를 오름차순으로 정렬되어 확인할 수 있다.
ZRANGE daily-score:220817 0 -1 withscores
"player:286"
"28"
"player:101"
"45"
ZRANGE는 스코어가 낮은 순서부터 출력하낟
상위 유저스코어 출력하고 싶을시
ZREVRANGE daily-score:220817 0 2 withscores
"player:234"
"400"
"player:24"
"357"
ZADD 가 기존 존재하는 키에 유저가 있으면 스코어가 업데이트 된다
직접 스코어 값을 지정해서 변경하지 않고도
ZINCRBY daily-score:220817 100 player:24
// player:24 100 증가
관계형 데이터베이스에서 주간 누적 랭킹을 구현하려면 하나의 테이블에서 일자에 해당하는 데이터를 모두 가져온 뒤 선수별로 합쳐야함 그리고 다시 소팅하는 작업 필요
sorted set 사용시 ZUIONSTORE 커맨드를 이용
→ 내가 생각하는 REDIS 를 활용해야 하는 큰 이유
ZUIONSORE 생성할 키 이름 합산할 키 개수 합산할키
ZUNIONSTORE weekly-score:2208-3 3 daily-score:220815 daily-score:220816 daily-score:220817
ZUNIONSTORE weekly-score:2208-3 3 daily-score:220815 daily-score:220816 daily-score:220817 weights 1 2 1
SELECT * FROM keyword WHERE user_id = 123 ORDER BY reg_date DESC LIMIT 5;
우저가 최근에 검색했던 테이블 최근 5ㅐㄱ 조회
이때는 테이블에 저장할때 기존에 사용자가 같은 키워드를 검색했는지 확인 한 뒤 업데이트 하는 작업 필요하며
테이블에 데이터가 무기한으로 쌓이는 것을 방지하기 위해 주기적 배치 작업을 돌려 오래된 검색 기록은 삭제하는 작업 필요
데이터를 가져올 때 검색한 시점 기준으로 소팅을 해야하기 때문에 사용자와 검색 기록이 늘어날 수록 많은 데이터를 테이블에서 관리해야한다는 문제
Sorted set 이용시 set이기 때문에 저장될 때부터 중복 허용하지 않ㅇ므
스코어를 시간을 이용한다면 검색 기록으로 정렬될수 있다.