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