Search
Duplicate
📒

[고성능 서비스를 위한 Redis] 05. Redis를 활용한 리더보드

상태
완료
수업
고성능 서비스를 위한 Redis
주제
Redis
4 more properties
참고

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
복사
내림차순 정렬