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
/**
*
* @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、一つは四つです。