学习 Redis SortedSet(有序集合)

学习 Redis SortedSet(有序集合)

 

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

import org.springframework.data.redis.connection.DefaultTuple;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisZSetCommands.Aggregate;
import org.springframework.data.redis.connection.RedisZSetCommands.Limit;
import org.springframework.data.redis.connection.RedisZSetCommands.Range;
import org.springframework.data.redis.connection.RedisZSetCommands.Tuple;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.ScanOptions.ScanOptionsBuilder;

public class TestRedisSortedSet {

	private static JedisConnectionFactory getJedisConnectionFactory() {
		JedisConnectionFactory jcf = new JedisConnectionFactory();
		jcf.setHostName("127.0.0.1");
		jcf.setPort(6379);
		jcf.setPassword("123");
		jcf.afterPropertiesSet();
		return jcf;
	}

	private static RedisConnection getRedisConnection() {
		return getJedisConnectionFactory().getConnection();
	}

	public static void main(String[] args) {
		RedisConnection rc = getRedisConnection();
		
		//ZADD 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
		boolean zAdd = rc.zAdd("zset".getBytes(), 11, "k".getBytes());
		System.out.println("ZADD [" + zAdd + "]");
		
		Set<Tuple> tuples = new HashSet<Tuple>();
		Tuple tuplev = new DefaultTuple("v".getBytes(), 12d);
		Tuple tuplew = new DefaultTuple("w".getBytes(), 12d);
		tuples.add(tuplev);
		tuples.add(tuplew);
		long mzAdd = rc.zAdd("zset".getBytes(), tuples);
		System.out.println("mzAdd [" + mzAdd + "]");
		
		//ZCARD 返回有序集 key 的基数。
		long zCard = rc.zCard("zset".getBytes());
		System.out.println("ZCARD [" + zCard + "]");
		
		//ZCOUNT 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
		long zCount = rc.zCount("salary".getBytes(), 2000, 4000);
		System.out.println("ZCOUNT [" + zCount + "]");
		
		long total = rc.zCount("salary".getBytes(), Range.unbounded());
		System.out.println("total [" + total + "]");
		
		Range range = new Range();
		range.gt(1000);
		range.lt(3000);
		long ltgt = rc.zCount("salary".getBytes(), range);
		System.out.println("ltgt [" + ltgt + "]");
		
		Range range2 = new Range();
		range2.gte(1000);
		range2.lte(3000);
		long ltegte = rc.zCount("salary".getBytes(), range2);
		System.out.println("ltegte [" + ltegte + "]");
		
		//ZINCRBY 为有序集 key 的成员 member 的 score 值加上增量 increment 。
		double zIncrBy = rc.zIncrBy("salary".getBytes(), 0, "Linda".getBytes());
		System.out.println("ZINCRBY [" + zIncrBy + "]");
		
		//ZRANGE 返回有序集 key 中,指定区间内的成员。
		Set<byte[]> zRange = rc.zRange("salary".getBytes(), 0, -1);
		Iterator<byte[]>  itr = zRange.iterator();
		while (itr.hasNext()) {
			System.out.println("ZRANGE [" + new String(itr.next()) + "]");
		}
		
		Set<Tuple> zRangeWithScores = rc.zRangeWithScores("salary".getBytes(), 0, -1);
		Iterator<Tuple> itrTuple = zRangeWithScores.iterator();
		while (itrTuple.hasNext()) {
			Tuple tuple = itrTuple.next();
			System.out.println(tuple.getScore() + " " + new String(tuple.getValue()));
		}
		
		//ZRANGEBYSCORE 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
		Set<byte[]> zRangeByScore = rc.zRangeByScore("salary".getBytes(), range2);
		Iterator<byte[]> itrzRangeByScore = zRangeByScore.iterator();
		while (itrzRangeByScore.hasNext()) {
			System.out.println("zRangeByScore [" + new String(itrzRangeByScore.next()) + "]");
		}
		
		Set<byte[]> zRangeByScoreWithLimit = rc.zRangeByScore("salary".getBytes(), range2, Limit.limit().offset(1).count(3));
		Iterator<byte[]> iters = zRangeByScoreWithLimit.iterator();
		while (iters.hasNext()) {
			System.out.println("zRangeByScoreWithLimit [" + new String(iters.next()) + "]");
		}
		
		//ZRANK 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
		long zRank = rc.zRank("salary".getBytes(), "Scott".getBytes());
		System.out.println("ZRANK [" + zRank + "]");
		
		//ZREM 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
		long zRem = rc.zRem("zdel".getBytes(), "a".getBytes(), "b".getBytes());
		System.out.println("ZREM [" + zRem + "]");
		
		//ZREMRANGEBYRANK 移除有序集 key 中,指定排名(rank)区间内的所有成员。
		long zRemRange = rc.zRemRange("zdel".getBytes(), 3, 5);
		System.out.println("zRemRange [" + zRemRange + "]");
		
		
		//ZREMRANGEBYSCORE 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
		long zRemRangeByScore = rc.zRemRangeByScore("zdel".getBytes(), 0, 5);
		System.out.println("ZREMRANGEBYSCORE [" + zRemRangeByScore + "]");
		
		//ZREVRANGE
		Set<byte[]> zRevRange = rc.zRevRange("salary".getBytes(), 0, -1);
		Iterator<byte[]> itrzRevRange = zRevRange.iterator();
		while (itrzRevRange.hasNext()) {
			System.out.println("ZREVRANGE [" + new String(itrzRevRange.next()) + "]");
		}
		
		Set<Tuple> zRevRangeWithScores = rc.zRevRangeWithScores("salary".getBytes(), 0, -1);
		Iterator<Tuple> itrWithScores = zRevRangeWithScores.iterator();
		while (itrWithScores.hasNext()) {
			Tuple tuple = itrWithScores.next();
			System.out.println("zRevRangeWithScores [" + tuple.getScore() + "  " + new String(tuple.getValue()) + "]");
		}
		
		//ZREVRANGEBYSCORE 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。
		Set<byte[]> zRevRangeByScore = rc.zRevRangeByScore("salary".getBytes(), 1000, 5000);
		Iterator<byte[]> itrzRevRangeByScore = zRevRangeByScore.iterator();
		while (itrzRevRangeByScore.hasNext()) {
			System.out.println("zRevRangeByScore [" + new String(itrzRevRangeByScore.next()) + "]");
		}
		
		//ZREVRANK 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
		long zRevRank = rc.zRevRank("salary".getBytes(), "Tom".getBytes());
		System.out.println("ZREVRANK [" + zRevRank + "]");
		
		//ZSCORE 返回有序集 key 中,成员 member 的 score 值。
		double zScore = rc.zScore("salary".getBytes(), "Jim".getBytes());
		System.out.println("ZSCORE [" + zScore + "]");
		
		//ZUNIONSTORE 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
		//默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。
		long zUnionStore = rc.zUnionStore("salary4".getBytes(), "salary".getBytes(), "salary2".getBytes());
		System.out.println("ZUNIONSTORE [" + zUnionStore + "]");
		
		int[] weights = {2, 4};
		long mzUnionStore = rc.zUnionStore("salary4".getBytes(), Aggregate.MAX, weights, "salary".getBytes(), "salary2".getBytes());
		System.out.println("mzUnionStore [" + mzUnionStore + "]");
		
		//ZINTERSTORE 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
		//默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.
		long zInterStore = rc.zInterStore("salary5".getBytes(), "salary".getBytes(), "salary2".getBytes());
		System.out.println("zInterStore [" + zInterStore + "]");
		
		long mzInterStore = rc.zInterStore("salary5".getBytes(), Aggregate.MAX, weights, "salary".getBytes(), "salary2".getBytes());
		System.out.println("mzInterStore [" + mzInterStore + "]");
		
		//ZSCAN
		ScanOptionsBuilder sob = ScanOptions.scanOptions().count(1).match("???");
		ScanOptions options = sob.build();
		Cursor<Tuple> zScan = rc.zScan("salary".getBytes(), options);
		while (zScan.hasNext()) {
			Tuple tuple = zScan.next();
			System.out.println("ZSCAN [" + tuple.getScore() + "  " + new String(tuple.getValue()) + "]");
		}
		
	}

}

 

Redis有序集合SortedSet实现原理 实现原理 阅读详情

相关推荐

Redis实战(7)-有序集合SortedSet之认识有序集合(命令行与代码实战)

摘要:缓存中间件Redis拥有许多丰富、重要且有趣的数据结构,前文介绍的字符串String、列表List和集合Set便是其中的佼佼者,本文以及后续篇章介绍的有序集合SortedSet和哈希Hash数据结构亦是如此,毫不夸张的说,当我们谈及Redis的应用场景时,这几种数据结构几乎都会涉及。本文我们将以命令行和代码的形式继续认识一下Redis的有序集合SortedSet

青松之竹_Java博客 1029

《Java基础入门第2版》--黑马程序员 课后答案及其详解 第6章 集合

文章目录一、填空题二、判断题三、选择题四、简答题五、编程题六、原题及其解析 一、填空题 1、Comparator 2、hashNext()、next() 3、键、值 4、ArrayList、LinkedList,HashSet、TreeSet,HashMap、TreeMap 5、forEach(Consumer action) 二、判断题 1、错 2、对 3、对 4、错 5、对 三、选择题 1、BC 2、D 3、C 4、D 5、ABC 四、简

hypertext123的博客 2万+

MR2数据集实战:5步搞定多模态谣言检测模型训练(附完整代码)

本文详细介绍了如何使用MR2多模态数据集构建高精度谣言检测系统,涵盖环境配置、数据准备、多模态特征工程、模型架构设计、训练调优及部署优化等5个关键步骤。通过双线性融合技术处理文本、图像和网页三模态数据,解决特征对齐和模态冲突等工程难题,并提供完整代码实现和性能优化方案。

weixin_42657024的博客 241

redis深入学习-04—redis的简单限流

123

jll126的博客 357

点云数据增强及预处理

数据增强: 1. random world flip:沿着x或者y轴,翻转点云 点云的x或者y,要翻转 3d box中心的x或者y,要翻转 3d box的朝向要翻转 point segmentation label,点云的相对顺序没有发生变化 2. random_world_rotation:沿着点云原点,旋转点云 点,x,y,绕z轴旋转 3d box,绕z轴旋转,中心和朝向都要变化 point segmentation label,点云的相对顺序没有发生变化 3. random_world_scaling

huang_victor的博客 4011

ISO18000-6B/6C(EPC C1G2)两个射频识别(RFID)标准协议的技术特点

目前读写器基本上是采用IMPINJ的R2000芯片和E710芯片开发,因为ISO18000-6B标准的现在应用很少,E710芯片已经不再支持ISO18000-6B标准,选择上就只有采用R2000芯片开发的UR6258超高频读写器以及手持机,这个在项目应用上需要留意。尽管ISO18000-6B标准具有上述优点,但也存在一些不足之处,特别是多标签阅读性能远远满足不了现在的应用需求,近年来发展停滞,绝大部分应用已经被ISO18000-6C(EPC C1G2)取代;#RFID# #物联网# #标准协议#

RFID设备与应用介绍 2157

Redis研究SCAN

SCAN 命令用于迭代当前数据库中的数据库键。 SSCAN 命令用于迭代集合键中的元素。 HSCAN 命令用于迭代哈希键中的键值对。 ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。 SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为

逆行者 537

【2025最新版】ABAP 开发百科全书专栏文章目录(上)

本文汇总了一系列SAP ABAP技术文章,内容涵盖实用技巧合集、函数式编程实践(如Currying、reduce应用)、设计模式实现(如Visitor、Singleton)、动态代理与Mock技术、性能优化方案(如Lazy Loading)、日期处理与内存管理,以及ABAP与JavaScript的编程范式对比。还涉及CDS视图、Fiori字段追踪、单元测试优化等实战经验,深入剖析了ABAP底层机制(如Internal Session、Function Module实现原理),并提供了多种反模式改进方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2484

SpringBoot引入Redis报org.springframework.data.redis.core.RedisTemplate类找不到错误

加上此注解就好了

yuyeqianhen的博客 6283

手把手教你学Simulink--基于飞轮储能系统的场景实例:飞轮储能与锂电池混合储能系统的协同控制

本文详细介绍了基于Simulink的飞轮储能与锂电池混合储能系统协同控制建模方法。通过高通/低通滤波器实现功率分配,使飞轮处理高频波动(±100kW),锂电池承担削峰填谷(50kW)。仿真结果表明,该系统效率达88%,锂电池循环次数减少90%,投资成本比纯电池方案节省200万美元。文章包含完整的建模步骤、控制策略设计和多场景仿真分析,为构建高效、长寿、经济的智能储能系统提供了实用解决方案。

MHD0815的博客 343

会计引擎:交易与核算分离的前世今生

一、为什么需要会计引擎 金融产品的设计,一如一块硬币需要兼顾两面:一面是为客户提供好的金融服务,满足客户支付结算、借贷、资产保值增值等方面的需求,并在这个过程中,以数字化的方式做好客户资产的登记,登记的载体,则是“分户”或“台账”,如客户存款户,是一种典型的分户--资金的增减变化都在一个账户中进行体现,而客户购买的银行理财,因为收益率、期限、投资标的不同,每一笔持有就形成一行记录,即为“台账”--这当然是不严谨但相对形象的表述。但是,“分户”和“台账”并没有必然的区别,以贷款为例,一些银行仍然存在所谓“

银行信息系统应用架构详解 985

使用java scan 大量的redis的key

1、redis配置 import com.soul.data.lettuce.config.AbstractSpringDataRedisConfig; import com.soul.data.redis.core.StringRedisTemplate; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.interceptor.KeyGenerator; import

微信公众号:一颗向上的草莓 2481

2025华为OD机试真题最新题库 (B+C+D+E+2025A+2025B卷) + 在线OJ在线刷题使用(C++、Java、Python C语言 JS合集)(正在更新2025B卷,目前已收录710道)

2024年,华为目前已经启用D卷,目前D卷和C卷的题目一样一次订阅永久阅读,支持在线刷题,持续更新,有问题随时解答,本专栏题目数量已收录到484道。每篇文章的思路分析都非常详细,题目新增图解思路,问题解疑,多样例测试,超过百字的思路参考解析。

KJ.JK 11万+

Redis命令学习-SortedSet(有序集合)

​ZADD      ZADD key score  member[score  member ... ]:将一个或多个member元素及其score值加入到有序集key中。如果member已经是有序集合中的值,则更新score。score是整数值,双精度值。如果key不存在,则创建一个有序集合,并加入。如果key不是一个有序集合,则返回一个错误。     返回值:成功添加

Mergades 1314

【一 扣子客户案例合集】【 1.1 抖音电商:通过扣子智能体重塑电商服务新体验】

**摘要:**抖音电商借助扣子(Coze)智能体平台重塑客服体验,通过无代码开发、多模态交互和跨平台发布等功能,解决了传统客服高峰期压力大、成本高及响应机械等痛点。智能体采用直接面客与人工监管结合模式,实现高效精准服务,并通过解构流程、模块化设计优化系统架构。其技术优势包括零配置学习、意图识别、情绪感知等,实际应用中显著提升客服效率300%以上,改善用户体验。未来将进一步拓展至商品推荐、直播互动等场景,推动电商服务智能化升级。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1571

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

redis命令参考(一) SortedSet相关

最近打算用到redis的排序功能,所以有接触,发现极好,比memcache功能丰富好多。先介绍一部分,以后慢慢学,慢慢补充。 先澄清一点,redis中,key表示有序集合的名字, 实际是member-value对。 一、Sorted Set (有序集合)   //自己歪歪,有序集合底层应该是插入排序算法 ZADD :将一个或多个member的值score,存入有序...

weixin_30940783的博客 78

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Redis数据类型之--集合、有序集合和HyperLogLog

一、Redis集合数据结构(set) Redis 的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来存储和查找数据,理论上一个集合可以存储 2 的 32 次方减 1 个节点(大约 42 亿)个元素,因为采用哈希表结构,所以对于 Redis 集合的插入、删除和查找的复杂度都是 0(1),只是我们需要注意 3 点。 对于集合而言,它的每一个元素都是不能重复的,当插入相同记录...

cogo_Time的博客 636

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

redis学习笔记(4)—— redis常用命令3

redis学习笔记(4)—— redis常用命令3redis常用命令set类型常用命令sorted set 有序集合常用命令手动高亮tip redis常用命令 set类型常用命令 sadd key number1 number2 … (向集合添加一个或多个成员) srem key number1 numner2 … (移除集合中一个或多个成员) scard key (获取集合的成员数) sdiff key1 key2 … (返回所有集合之间的差集) sdiffstore destinationkey ke

qq_43302195的博客 235

Redis--黑马点评Day3

这篇博客本来想在昨天发布的,但是昨天再刷科四的题,耽误了很长时间,导致我没时间去写。今天稍微掌握好了时间,来—继续坚持。有朋友们看足球吗,英超要开赛了,除了编程问题,也可以来找我聊一聊足球,我是KOP。

2401_88736401的博客 185

Redis中五大数据类型和常用命令

Redis常见数据类型和相关命令

Yeee_F 596

你不会仅仅把Redis作为缓存的工具吧?给你一亿个keys,如何高效统计?

Set集合的交差并的计算复杂度很高,如果数据量很大的情况下,可能会造成Redis的阻塞。那么如何规避阻塞呢?在Redis集群中选一个从库专门负责聚合统计,这样就不会阻塞主库和其他的从库了将数据交给客户端,由客户端进行聚合统计。总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。

m0_60707660的博客 288

对 Redis 中的有序集合SortedSet的理解

本篇说一下Redis中的 有序集合类型,曾几何时,我们想把所有数据存到内存中的 数据结构 中,但为了多机器共享内存,不得不将这块内存包装成wcf单独部署,同时还要考虑怎么序列化,烦心事太...

dotNET跨平台 515

Redis 基础 -- 有序集合 SortedSet类型 和 SortedSet类型的常用命令

Redis的有序集合(SortedSet)同时具有 有序和 集合两种性质,这种数据结构中的每个元素都由一个成员和一个与成员相关联的分值组成,其中成员(value)以字符串方式存储,而分值(score)则以64位双精度浮点数格式存储。

天行健 君子以自强不息,地势坤 君子以厚德载物。 4178

有序集合:Redis有序集合的操作和应用

1.背景介绍 1. 背景介绍 Redis(Remote Dictionary Server)是一个开源的高性能键值存储系统,由 Salvatore Sanfilippo 于2009年开发。Redis 支持数据的持久化,不仅仅支持简单的键值对存储,同时还提供列表、集合、有序集合等数据结构的存储。Redis 并非仅仅是数据库,还具有消息队列、通信队列等功能。 在 Redis 中,有序集合(Sor...

AI天才研究院 1552

redis命令详解与使用场景举例——SortedSet(有序集合)

ZADD key score member [[score member] [score member] …]将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。 score 值可以是整数值或双精

路漫漫,水迢迢 4928

Redis数据类型使用场景及有序集合SortedSet底层实现详解

Redis数据类型使用场景及有序集合SortedSet底层实现详解   Redis常用数据类型有字符串String、字典dict、列表List、集合Set、有序集合SortedSet,本文将简单介绍各数据类型及其使用场景,并重点剖析有序集合SortedSet的实现。   List的底层实现是类似Linked List双端链表的结构,而不是数组,插入速度快,不需要节点的移动,...

xuyi19921216的博客 6557
上一篇: MySQL 修改表 删除字段
下一篇: java jsoup 网络爬虫 jsoup解析html Java爬虫 Jsoup爬虫 jsoup例子
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值