使用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 @   官萧何  阅读(1728)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示