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