게임에서 상위랭커, 쇼핑몰에서 인기상품과 같이 실시간 랭킹!
RDB의 경우
update query는 한 행에 접근하므로 빠른 성능을 가짐
Update ranking Set score = 1550 Where userId = A;
조회 query는 데이터를 정렬하거나 Count query와 같은 집계 연산을 수행해야되므로 데이터가 많아질수록 속도가 엄청나게 느려짐!
ex) 상위 5개 출력
Select userId From ranking Ordery By score Desc Limit 0,5;
순위 컬럼을 만들어서 해결?
장점
선언
private final static String LEADER_BOARD_KEY = "leaderBoard"; //redis 변수명 private final StringRedisTemplate redisTemplate;
UserId와 점수 등록
public boolean setUserScore(String userId, int score){ ZSetOperations zSetOps = redisTemplate.opsForZSet(); //Sorted Set 선언 zSetOps.add(LEADER_BOARD_KEY,userId,score); return true; }
UserId로 등수 확인
public Long getUserRanking(String userId){ ZSetOperations zSetOps = redisTemplate.opsForZSet(); return zSetOps.reverseRank(LEADER_BOARD_KEY, userId); }
상위권 등수 확인
public List<String> getTopRank(int limit){ ZSetOperations zSetOps = redisTemplate.opsForZSet(); Set<String> range = zSetOps.reverseRange(LEADER_BOARD_KEY, 0, limit-1); return new ArrayList<>(range); }
출처 및 링크 : fastcampus