반응형
redis 이용한 리더보드
Redis를 사용하여 랭킹 리더보드를 구현 했을 때 장점
- Redis는 In-Memory 저장소로 매우 빠른 액세스 속도를 갖습니다. 또한 자료구조(Key-Value) 특성으로 읽기 및 작업 속도를 제공합니다. 때문에 랭킹을 실시간으로 업데이트 할 수 있습니다.
- Redis는 Sorted Set이라는 데이터 구조를 제공하여 요소를 정렬된 상태로 저장할 수 있습니다. 이 데이터 구조는 랭킹을 구현하는 데 유용합니다.
Sorted Set 데이터 구조 이용하기
Redis의 Soted Set 데이터 구조를 조작하기 위해 Spring Data Redis에서 제공하는 인터페이스인 ZSetOperations를 이용해주면 됩니다.
ZSetOperations 인터페이스를 통해 다음과 같은 기능을 수행할 수 있습니다.
- Sorted Set 조작
- 사용자의 점수를 증가 시키거나 감소
- 사용자의 순위 조회
구현 코
@Service @RequiredArgsConstructor public class RankingService { private final StringRedisTemplate redisTemplate; private static final String LEADERBOARD_KEY = "Ranking_Leader_Board"; public List<String> getTopRank(int limit) { ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet(); Set<String> rangeSet = zSetOperations.reverseRange(LEADERBOARD_KEY, 0, limit - 1); return new ArrayList<>(rangeSet); } public List<String> getTopRankWithScore(int limit) { ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet(); Set<TypedTuple<String>> rangeWithScoreSet = zSetOperations.reverseRangeWithScores(LEADERBOARD_KEY, 0, limit - 1); return rangeWithScoreSet.stream() .map(tuple -> tuple.getValue() + "," + tuple.getScore()) .toList(); } public Long getUserRank(String userId) { ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet(); Long rank = zSetOperations.reverseRank(LEADERBOARD_KEY, userId); return (rank != null) ? rank + 1 : null; } public boolean setUserScore(String userId, int score) { ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet(); zSetOperations.add(LEADERBOARD_KEY, userId, score); return true; } public boolean removeUser(String userId) { ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet(); return zSetOperations.remove(LEADERBOARD_KEY, userId) > 0; } }
반응형
'DBMS > Redis' 카테고리의 다른 글
Redis redis-cli 명령어 정리 (2) | 2024.02.05 |
---|---|
Redis 간단하고 빠른 In-Memory 데이터 저장, docker에 Redis 설치, Redis 명령어 (1) | 2024.01.31 |