참고
Redis LeaderBoard
NOTE
리더보드
⇒ 게임에서 랭킹, 쇼핑몰에서 인기상품과 같은 실시간 랭킹!
애니팡이 생각난다..
RDM로 구현하는 경우
NOTE
Update ranking Set score = 1550 Where userId = A;
SQL
복사
•
갱신 query는 한 행에 접근하므로 빠른 성능을 가진다.
Select userId From ranking Ordery By score Desc Limit 0,5;
SQL
복사
•
조회 query는 데이터를 정렬하거나, 집계 연산을 수행해야하므로 데이터가 많아질수록 속도가 느려진다!
Redis로 구현하는 경우
NOTE
•
순위 데이터에 적합한 Sorted-Set의 자료구조를 사용하면 score를 통해 자동으로 정렬된다.
•
용도에 특화된 오퍼레이션이 존재하므로 사용이 간단하다.
•
빈번한 액세스에 유리한 In-Memory DB의 속도
실제 Redis 구현
NOTE
public boolean setUserScore(String userId, int score) {
ZSetOperations<String, String> zSetOps = redisTemplate.opsForZSet();
zSetOps.add(LEADERBOARD_KEY, userId, score);
return true;
}
Java
복사
Sorted-Set활용해서 저장
public Long getUserRanking(String userId) {
ZSetOperations<String, String> zSetOps = redisTemplate.opsForZSet();
Long rank = zSetOps.reverseRank(LEADERBOARD_KEY, userId);
return rank;
}
Java
복사
내림차순으로 랭킹
public List<String> getTopRank(int limit) {
ZSetOperations<String, String> zSetOps = redisTemplate.opsForZSet();
Set<String> rangeSet = zSetOps.reverseRange(LEADERBOARD_KEY, 0, limit - 1);
assert rangeSet != null;
return new ArrayList<>(rangeSet);
}
Java
복사
내림차순 정렬