使用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()); } } }
⎛⎝官萧何⎠⎞一只快乐的爪哇程序猿;邮箱:1570608034@qq.com
分类:
springBoot开发
, java基础
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现