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     }

 完毕!仅供参考学习,转载请在明显位置注明出处,谢谢!

上一篇:常见的排序算法


下一篇:嵌入式轻量级数据库 SQLite和 System.Data.SQLite