通过redis中zset类型来实现每日排行榜还是比较容易的,但也有一些地方需要注意。
具体实现代码如下:
1.设置数据
首先是要把需要的数据设置到redis中,注意分值前面的负号,由于zset特性是越小排到越前,所以分值需要加上负号才能到达分值越大排名越靠前的效果。
1 /** 2 * 设置排行榜信息 3 * 4 * @param anchorId 5 * @param score 6 * @param userId 7 */ 8 public static void setRankInfoCache(UUID anchorId, Integer userId, Double score, Integer siteId) { 9 getJedisClientProxy().zadd(SafeEncoder.encode(LiveAnchorContextCacheKey.getDayRewardCacheKey(anchorId, siteId)), 10 -score, SafeEncoder.encode(String.valueOf(userId))); 11 }
2.获取当日排行榜前十
1 /** 2 * 获取当日排行榜前十信息缓存 3 * 4 * @param key 5 * @return 6 */ 7 public static List<LiveUserRankCache> getDayRankCache(String key) { 8 List<LiveUserRankCache> userRankCacheList = new ArrayList<>(); 9 // TODO 默认取排行榜前十,可根据需求改成 TopN 10 Set<Tuple> tuples = getJedisClientProxy().zrangeWithScores(SafeEncoder.encode(key), 0, 9); 11 long rank = 1; 12 for (Tuple tuple : tuples) { 13 userRankCacheList.add(new LiveUserRankCache(rank, -tuple.getScore(), tuple.getElement())); 14 } 15 return userRankCacheList; 16 }
3.根据用户ID获取排行榜信息
1 /** 2 * 根据用户ID获取排行榜信息 3 * 4 * @param key 5 * @param userId 6 */ 7 public static LiveUserRankCache getRankInfoCache(String key, Integer userId) { 8 Long rank = getJedisClientProxy().zrank(SafeEncoder.encode(key) 9 , SafeEncoder.encode(String.valueOf(userId))); 10 if (rank == null) { 11 // 没有排行时,直接返回一个默认的 12 return new LiveUserRankCache(-1L, 0D, String.valueOf(userId)); 13 } 14 Double zscore = getJedisClientProxy().zscore(SafeEncoder.encode(key) 15 , SafeEncoder.encode(String.valueOf(userId))); 16 return new LiveUserRankCache(rank + 1, -zscore, String.valueOf(userId)); 17 }
完毕!仅供参考学习,转载请在明显位置注明出处,谢谢!