0
点赞
收藏
分享

微信扫一扫

Spring Boot+Redis实现排行榜功能

诗与泡面 2021-09-28 阅读 132
Redis

关于Spring Boot与Redis的整合,在前一篇已经介绍过了,这里就不再累述了。本篇是在上一篇的基础上实现的,若有疑问,请移步https://www.jianshu.com/p/cc27fc09d06a。

1.在RedisUtil里面添加Sorted Set的相关方法

 /**
               * 有序集合添加之前没有的元素
     */
    public boolean zAdd(String key,Object value,double score) {
        return redisTemplate.opsForZSet().add(key, value,score);
    } 
    
 /**
     * 获取集合中元素的排名(从大到小排序)
     * @param key
     * @param value
     * @return
     */
    public long zGetRank(String key,Object value) {
        return redisTemplate.opsForZSet().reverseRank(key, value);
    }

    /**
      * 若集合中已有此元素,则此元素score+传入参数
      * 若没有此元素,则创建元素。
     * @param key
     * @param value
     * @param score
     */
   public void zIncreamentScore(String key,Object value,double score) {
       redisTemplate.opsForZSet().incrementScore(key, value, score);
   }
    
  
    /**
     * 对集合按照分数从小到大排序(默认)
     * 指定位置区间0,-1指排序所有元素
     * 得到的值带有score
     * @param key
     * @return 
     */
    public Set<TypedTuple<Object>> zRangeWithScore(String key) {
        return redisTemplate.opsForZSet().rangeWithScores(key, 0, -1);
    }
    
    /**
     * 对集合按照分数从大到小排序
     * @param key
     * @return
     */
    public Set<TypedTuple<Object>> zReverseRangeWithScore(String key){
        return redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, -1);
    }
    
 /**
    * 获取有序集合的大小
    * @param key
    * @return
    */
    public Long zGetSize(String key) {
        return redisTemplate.opsForZSet().size(key);
    }
    
    /**
     * 获取key集合里面,value值的分数
     * @param key
     * @param value
     * @return
     */
    public double zGetScoreByValue(String key,Object value) {
        return redisTemplate.opsForZSet().score(key, value);
    }
    

    /**
     * 指定分数区间,从大到小排序
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<TypedTuple<Object>> zReverseRangeByScoreWithScores(String key,double start,double end){
        return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, start, end);
    }
    

2.RankService添加实现排行榜的接口

package com.ljessie.redisdemo.service;

import java.util.Set;

import org.springframework.data.redis.core.ZSetOperations.TypedTuple;

public interface RankService {
    

    boolean zAdd(String value,double score);
    
    void zIncreamentScore(String value,double score);
    
    long zGetRank(String value);
    
    double zGetScore(String value);
    
    Set<TypedTuple<Object>> rankWithScore();
}

3.RankServiceImpl实现service的接口

package com.ljessie.redisdemo.service.impl;

import java.util.Set;

import javax.annotation.Resource;

import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
import org.springframework.stereotype.Service;

import com.ljessie.redisdemo.service.RankService;
import com.ljessie.redisdemo.utils.RedisUtil;

@Service
public class RankServiceImpl implements RankService{

    @Resource
    RedisUtil redisUtil;
    
    public static final String key = "USER_SCORE_RANK";
    
    /**
     * 向排行榜里面添加数据,value是用户信息,demo里面村的是user_id,socre是用户的分数
     */
    @Override
    public boolean zAdd(String value, double score) {   
        return redisUtil.zAdd(key, value, score);
    }

    /**
     * 增加用户的积分
     */
    @Override
    public void zIncreamentScore(String value, double score) {
        redisUtil.zIncreamentScore(key, value, score);
    }

    /**
     * 获取用户的排名
     */
    @Override
    public long zGetRank(String value) {
        return redisUtil.zGetRank(key, value);
    }

    /**
     * 获取用户的分数
     */
    @Override
    public double zGetScore(String value) {
        return redisUtil.zGetScoreByValue(key, value);
    }

    /**
     * 获取排行榜,按照分数从大到小排序
     */
    @Override
    public Set<TypedTuple<Object>> rankWithScore() {
        return redisUtil.zReverseRangeWithScore(key);
    }

}

排行榜里面,总共有三个参数,key = "USER_SCORE_RANK",表示排行榜的key,排行榜里面所有用户数据的key都是这个"USER_SCORE_RANK";value表示用户信息,可以存user_id,user_name等信息;socre表示用户的分数,排行榜里面,就是按照这个score进行排序。

4.RankController

package com.ljessie.redisdemo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ljessie.redisdemo.service.RankService;

@RestController
@RequestMapping("/rank/")
public class RankController {
    
    @Autowired
    RankService rankService;
    
    @RequestMapping("/add_source")
    public Object addSource(String uid,double score) {
        if(rankService.zAdd(uid, score)) {
            return "add source success";
        }else {
            return "add source failed";
        }
    }
    
    @RequestMapping("/increase_score")
    public String increaseScore(String uid,double score) {
        rankService.zIncreamentScore(uid, score);
        return "user_score:"+rankService.zGetScore(uid);
    }
    
    @RequestMapping("/get_rank_by_uid")
    public String getRank(String uid) {
        long rank = rankService.zGetRank(uid);
        return "user_rank:"+rank;
    }
    
    @RequestMapping("/get_rank")
    public Object getRank() {
        return rankService.rankWithScore();
    }
}

举报

相关推荐

0 条评论