redisによるランキング実現

3457 ワード

最近会社の業務のため、ユーザーに新人を招待してランキングの統計を行う必要があります。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、一つは四つです。