Redis學習系列(三)——實時排行榜

實時排行榜

環境:SpringBoot2.0

依賴

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

實例

  /**
     * 排行榜的KEY
     */
    public String KEY_DD="test:countMoney";
    public String KEY_DD1="countMoney1";
    public String KEY_DD2="countMoney2";
    public String KEY_DD3="countMoney3";

    /**
     * 初始數據
     */

    public void init() {
        ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();
        Set<ZSetOperations.TypedTuple<User>> users = new HashSet<>();
        for (int i = 0; i < 50; i++) {
            //爲用戶初始化數據
            User user = new User(i, "sjy" + i, "https://www.baidu.com?" + i);
            users1.add(user);
            DefaultTypedTuple<User> tuple = new DefaultTypedTuple<User>( user, 0d);
            users.add(tuple);
        }
        // 批量新增
        zSet.add(KEY_DD, users);
    }

    /**
     * 隨機人隨機加分
     */
    public void addSource() {
        Random random = new Random();
        for (int j = 0; j < 100; j++) {
            int i = random.nextInt(50);
            ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();
            int i1 = new Random().nextInt(6);
            // 加法運算  i1是正增量
            zSet.incrementScore(KEY_DD,users1.get(i),i1 );
            //更新 替換
            //zSet.add(KEY_DD,users1.get(i),i1 );
        }
    }

    /**
     * 查詢集合中所有的成員
     */

    public Set<User> all(){
        ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();
        return zSet.reverseRange(KEY_DD, 0, -1);
    }
    /**
     * 查看前十名
     */
    public Set<ZSetOperations.TypedTuple<User>> top10(){
        ZSetOperations<String, User> zSet = redisTemplate.opsForZSet();

        // 獲取分數前十名的用戶
        Set<User> userSet = zSet.reverseRange(KEY_DD, 0, 9);

        assert userSet != null;
        System.out.println(userSet.size());
        for (Serializable serializable : userSet) {
            System.out.print(serializable.toString()+", ");
        }
        // 獲取分數前十名的用戶以及對應的分數
        Set<ZSetOperations.TypedTuple<User>> scores = zSet.reverseRangeWithScores(KEY_DD, 0, 10);

        System.out.println();
        assert scores != null;
        System.out.println(scores.size());
        for (ZSetOperations.TypedTuple<User> score : scores) {
            System.out.print(score.getValue()+" : "+(score.getScore().intValue())+", ");
        }
        return scores;

    }

    /**
     * 分數之間的用戶人數
     */
    public void limitNum1toNum2Count(){

        Long count = redisTemplate.opsForZSet().count(KEY_DD, 0, 10);

    }


    public void intersectAndStore(){

        // KEY_DD1集合與KEY_DD2集合,共同的交集元素存到KEY_DD3(複製),返回元素個數
        redisTemplate.opsForZSet().intersectAndStore(KEY_DD1,KEY_DD2,KEY_DD3);

        // KEY_DD1集合與KEY_DD2集合,共同的並集元素存到KEY_DD3(複製),返回元素個數
        redisTemplate.opsForZSet().unionAndStore(KEY_DD1,KEY_DD2,KEY_DD3);
    }

    /**
     * 刪除集合中的元素
     */
    public void remove(){

        //刪除集合
        redisTemplate.opsForZSet().remove(KEY_DD,users1.get(0));
        //刪除數組中0<=~<=2索引的元素 數據是倒敘的所以刪除的是最小的三個值
        //redisTemplate.opsForZSet().removeRange(KEY_DD,0,2);
        // 刪除集合中分數是0<=~<=10的元素
        // redisTemplate.opsForZSet().removeRangeByScore(KEY_DD, 0, 9);

    }
    }
    

    class User implements Serializable {

        private static  final  long serialVersionUID=0L;

        private Integer id; //id
        private String name; //姓名
        private String url; //地址

        public User() {
        }

        public User(Integer id, String name, String url) {
            this.id = id;
            this.name = name;
            this.url = url;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

總結

 1. 添加
	//添加
	Boolean add(K var1, V var2, double var3);
	
	//批量添加
    Long add(K var1, Set<ZSetOperations.TypedTuple<V>> var2);
    
 2. 刪除
	//刪除
    Long remove(K var1, Object... var2);
    
 3. 運算
	//加減運算  var3是增量
    Double incrementScore(K var1, V var2, double var3);
    
 4. 檢索

    //返回元素在集合的排名,有序集合時按照元素的score值由小到大排列
    Long rank(K var1, Object var2);

    //返回元素在集合的排名,按元素的score值由大到小排列
    Long reverseRank(K var1, Object var2);

    //獲取集合的元素, 從小到大排序, start開始位置, end結束位置
    Set<V> range(K var1, long var2, long var4);

    //獲取集合元素, 並且把score值也獲取,
    Set<ZSetOperations.TypedTuple<V>> rangeWithScores(K var1, long var2, long var4);

    //根據Score值查詢集合元素的值, 從小到大排序
    Set<V> rangeByScore(K var1, double var2, double var4);

    //根據Score值查詢集合元素, 從小到大排序
    Set<ZSetOperations.TypedTuple<V>> rangeByScoreWithScores(K var1, double var2, double var4);

    //根據Score值查詢集合元素的值, 從小到大排序
    Set<V> rangeByScore(K var1, double var2, double var4, long var6, long var8);

    //根據Score值查詢集合元素, 從小到大排序
    Set<ZSetOperations.TypedTuple<V>> rangeByScoreWithScores(K var1, double var2, double var4, long var6, long var8);

    
    Set<V> reverseRange(K var1, long var2, long var4);

    
    Set<ZSetOperations.TypedTuple<V>> reverseRangeWithScores(K var1, long var2, long var4);

    // 根據Score值查詢集合元素, 從大到小排序
    Set<V> reverseRangeByScore(K var1, double var2, double var4);

    // 根據Score值查詢集合元素,並且把score值也獲取 從大到小排序
    Set<ZSetOperations.TypedTuple<V>> reverseRangeByScoreWithScores(K var1, double var2, double var4);

    //據score值獲取集合元素數量
    Long count(K var1, double var2, double var4);

    //獲取集合大小
    Long size(K var1);

    //獲取集合大小
    Long zCard(K var1);

    //獲取集合中value元素的score值
    Double score(K var1, Object var2);

    //移除指定索引位置的成員
    Long removeRange(K var1, long var2, long var4);

	//根據指定的score值的範圍來移除成員
    Long removeRangeByScore(K var1, double var2, double var4);

    //獲取var1和var2的並集並存儲在var3中
    Long unionAndStore(K var1, K var2, K var3);
   

    // KEY_DD1集合與KEY_DD2集合,共同的交集元素存到KEY_DD3(複製),返回元素個數
    Long intersectAndStore(K var1, K var2, K var3);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章