使用redis zset 數據結構進行分數排名


package com.mybatis.plus;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.HashSet;
import java.util.Set;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestClass {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    /**
     * zset(Sorted Set 有序集合)也是 string 類型元素的集合,且不允許重復的成員。每個元素都會關聯一個 double 類型的分數。可以通過分數將該集合中的成員從小到大進行排序。
     *
     * zset 的成員是唯一的,但權重參數分數(score)卻可以重復。集合中的元素能夠按 score 進行排列。它可以用來做排行榜應用、取TOP/N、延時任務、范圍查找等。
     *
     * 使用redisTemplate.opsForZSet() 操作ZSet集合
     * Boolean add(K var1, V var2, double var3);
     * Long add(K key, Set<ZSetOperations.TypedTuple<V>> tuples)            增加一個有序集合
     *
     * Long remove(K key, Object... values)    從有序集合中移除一個或者多個元素
     *
     * Set<V> range(K KET, long var2, long var4);   查看ZSet集合中的元素
     *
     * Long rank(K key, Object value)   返回有序集中指定成員的排名,其中有序集成員按分數值遞增(從小到大)順序排列
     *
     * rank  返回有序集中指定成員的排名,    其中有序集成員按分數值遞增(從小到大)順序排列
     *
     * range方法:通過索引區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列。
     *
     * rangeByScore方法:通過分數區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列。
     *
     * count方法:通過分數返回有序集合指定區間內的成員個數。
     *
     * size方法:獲取有序集合的成員數。
     */
    @Test
    public void test5(){

        redisTemplate.opsForZSet().add("StudentZSet","99",9.9);
        redisTemplate.opsForZSet().add("StudentZSet","80",8.0);
        redisTemplate.opsForZSet().add("StudentZSet","69",6.9);
        redisTemplate.opsForZSet().add("StudentZSet","52",5.4);
        redisTemplate.opsForZSet().add("StudentZSet","32",3.4);
        redisTemplate.opsForZSet().add("StudentZSet","23",3.9);

        System.out.println(redisTemplate.opsForZSet().range("StudentZSet",0,-1));
        // 移除ZSet中的一個或多個元素
        redisTemplate.opsForZSet().remove("StudentZSet","69");
        System.out.println("移除ZSet中的一個或多個元素:"+redisTemplate.opsForZSet().range("StudentZSet",0,-1));
        //通過分數區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列。
        System.out.println("通過分數區間返回有序集合成指定區間內的成員:"+redisTemplate.opsForZSet().rangeByScore("StudentZSet", 3, 8));

        System.out.println("分數在4至8區間內的成員個數:" + redisTemplate.opsForZSet().count("StudentZSet", 4, 8));

        // 遍歷 zset
        Cursor<ZSetOperations.TypedTuple<String>> cursor = redisTemplate.opsForZSet().scan("StudentZSet", ScanOptions.NONE);
        while (cursor.hasNext()){
            ZSetOperations.TypedTuple<String> next = cursor.next();
            //System.out.println(next); // 打印的對象地址 org.springframework.data.redis.core.DefaultTypedTuple@35698b75
            System.out.println(next.getValue() + " 的分數值:" + next.getScore());

        }

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM