list redis 怎样做排行_基于redis实现排行榜

最近由于公司业务,需要对用户邀请新人做排名统计,开始用了sql做了统计展示,后觉得每次刷新排行榜都需要去数据库中查询,不仅影响性能,效率可能也不是很好。后了解到可以使用redis zset做排名统计,故此记录。

/**

* 功能描述 将数据缓存到redis中

* @author zm

* @date 2019/9/23 10:15

* @param userInfo count

* @return void

*/

private void setRedisUserRankInfo(UserInfo userInfo, Integer count){

try {

Map userInfoMap = new HashMap<>();

userInfoMap.put("nickName",userInfo.getUserName());

userInfoMap.put("headImg", userInfo.getAvatar());

redisTemplate.opsForZSet().add(REDISKEY,userInfo.getUserId(),count.doubleValue());

redisTemplate.opsForValue().set(REDISKEY+"_"+userInfo.getUserId(),JSON.toJSONString(userInfoMap));

} catch (Exception e) {

log.error("信息存入redis异常",e);

}

}

/**

* 功能描述 获取排行榜

* @author zm

* @date 2019/9/23 10:27

* @param

* @return java.util.List>

*/

private List> getRankList(){

List> rank = new ArrayList<>();

Set> typedTuples = redisTemplate.opsForZSet().reverseRangeByScoreWithScores(REDISKEY, 0, 99999, 0, 10);//只取前十条

int index = 0;

for(ZSetOperations.TypedTuple typle:typedTuples){

Map userRankMap = new HashMap<>();

userRankMap.put("userId",typle.getValue());

userRankMap.put("count",typle.getScore().intValue());

userRankMap.put("rank",++index);

String userInfo = redisTemplate.opsForValue().get(REDISKEY+ "_" + typle.getValue());

if(StringUtils.isNotBlank(userInfo)){

Map userInfoMap = JSON.parseObject(userInfo, HashMap.class);

userRankMap.put("nickName",userInfoMap.get("nickName"));

userRankMap.put("headImg",userInfoMap.get("headImg"));

}

rank.add(userRankMap);

}

return rank;

}

/**

* 功能描述 获取 我的 排名信息

* @author zm

* @date 2019/9/23 10:42

* @param userId

* @return java.util.Map

*/

private Map getUserRank(String userId){

Long userRank = redisTemplate.opsForZSet().reverseRank(REDISKEY, userId);//我的排名

Double count = redisTemplate.opsForZSet().score(REDISKEY, userId);//我的分数

Map userRankMap = new HashMap<>();

userRankMap.put("userId",userId);

if(userRank ==null || agentCount ==null){

return null;

}

userRankMap.put("count",count.intValue());

userRankMap.put("rank",userRank+1);

String userInfo = redisTemplate.opsForValue().get(REDISKEY+ "_" + userId);

if(StringUtils.isNotBlank(userInfo)){

Map userInfoMap = JSON.parseObject(userInfo, HashMap.class);

userRankMap.put("nickName",userInfoMap.get("nickName"));

userRankMap.put("headImg",userInfoMap.get("headImg"));

}

return userRankMap;

}

是不是比写sql简单太多了!!

redis zset,一块钱四个,嘿嘿!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值