利用 Redis 的 ZSet 有序集合的数据结构来帮助实现排行榜(从大到小)功能:
实现功能
- 返回排行内的前n名;
- 实时更新排行榜;
获取排行榜中指定范围的数据
// 获取操作 Redis 有序集合的对象
ZSetOperations<String, Object> zSet = redisTemplate.opsForZSet();
// 获取指定的键(key)和指定范围的有序集合
Set<ZSetOperations.TypedTuple<Object>> rangeWithScores = zSet.reverseRangeWithScores(key, 0, -1);
// 可遍历该集合获取指定的 score 和 value
for (ZSetOperations.TypedTuple<Object> rangeWithScore : rangeWithScores) {
rangeWithScore.getValue();
rangeWithScore.getScore();
}
往排行榜中新增记录
新增可以用两个方法:
ZSetOperations<String, Object> zSet = redisTemplate.opsForZSet();
// 方法一:incrementScore
zSet.incrementScore(key, value, 1000);
// 方法二:add
zSet.add(key, value, 1000);
更新排行榜中的记录
使用方法同上,需要注意的是,使用incrementScore方法新增小数值的数据时会存在精度问题;这种情况需要先查出原值,通过代码新增后调用add方法覆盖redis中的值来实现更新;
参考大佬代码
链接: rankings.