使用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());

        }

    }

}

 

posted @ 2022-03-23 15:37  官萧何  阅读(1705)  评论(0编辑  收藏  举报