Java中通过redis实现每日实时排行榜

通过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     }

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值