redis-zset数据类型的常见指令(sorted set)

Redis学习之旅 ZSet(Sorted set)篇 Redis学习之旅 ZSet(Sorted set)篇 为啥它叫ZSet?因为Set的开头字母也是S,Sorted Set缩写为SSet不合适 ,会导致命令冲突 ,所以干脆用Z代替,ZSet出生了~ 它的出现也是解决set天生无序的问题 命令学习 redis-cli模式下键入 help @sorted_set就可以快速相关的命令集合 1.0 时代 命令 起始版本 作用 示例 ZADD 1.2.0 添加元素 ZADD key [NX ZCARD 1.2.0 和SCARD很类似,统计 阅读详情

当你想学zset数据类型的时候,说明你应该已经接触过list,set之类的数据类型,list是一个链表,且list中的元素是可以重复的,就像数组中的元素一致,但是set可以说是一个集合,并且set存的每一个元素都是唯一的,这就像我们学习过的set数据结构一样,可以是TreeSet,HashSet;

而我今天要说的是zset集合,set是无序的,zset是有序的,那zset是根据什么来排序的,在设计的时候就给zset的每一个元素member绑定了一个score分数,每一个member都有一个score,每一个score也都有一个member,可以通过member找到对应的score,也可以通过score找到对应的member,听起来像是key-value,但不是key-value,如果是key-value,通过key可以找到value,但是通过value,却不能找到key;

以上是一个抽象的概念,接下来用一张图来表示一下:

从上面这张图就可以看到每一个member都有一个score,可以理解成给这个member绑定一个score,表示这个member的某种属性的大小,联想到游戏的话可以说是一个玩家的战力等等,而且zset天生就是有序的,排序的依据是score,上面的图其实降序的,但是实际zset默认的排序是升序的;虽然member和score是成对出现的,但是终究member是主角,score只是辅助作用;这时候可能有人会有疑问,member不能重复,那score总可以重复的,是的,score是可以重复,那么既然排序依据是score,如果score一样,该如何排序的,总不能是根据先来后到的顺序,实际不是的,而且根据member字符的字典序来排序的;接下来就介绍一下如何使用zset吧;

1、zadd key [nx|xx] [gt|lt] [ch] [incr] score member [score member ....]

        我们可以来看一下官方文档对这个指令的介绍

如果是XX:只是更新已经存在的元素,不会添加新的元素,这个elements指的是member,也就是说如果member已经存在的话,我们就是去更新他的score,如果member不存在,也不会添加一个新的member-score;

如果是NX:只是添加新的元素,不会更新已经存在的元素;如果member不存在,就添加一个这个member-score,如果member存在,也不会更新他的score;

LT:只是更新已经存在的元素当这个新的score小于原来member的score;这个flag并不会阻止添加新的member-score;也就是这个指令只对已经存在的元素生效,如果元素不存在,这个LT并不会影响添加元素;

GT:只是更新已经存在的元素,当这个新的score大于原来member的score;这个flag并不会阻止添加新的member-score;也就是这个指令只对已经存在的元素生效,如果元素不存在,这个GT并不会影响添加元素;

如果这个指令不加上CH的话,返回值就是添加成功的member,因为有些member添加的时候肯定有些是已经存在的,所以返回值并不一定等于你添加的member-score的对数;CH(是change缩写)意思是加上ch就会改变指令的返回值的大小,会在原来的返回值的大小(添加成功的对数)的基础上加上socre被改变的个数,返回值的大小并不只是新添加的member的个数;

最后一个选择项:incr,其实值适用于只有一个score member的时候,会原来的score的基础上机上socre,作为该member新的元素;

2、zadd key incr value member

        给member的score加上value,value可以是小数,可以是负数,返回就是改变后的score 

3、zcard key

        返回key的member-score的对数,时间复杂度是O(1),原因是有一个变量存的就是key的member-score的对数;

4、zcount key mix max

        返回score在[mix,max]的个数,时间复杂度是O(logN),这个个数是如何得出来的呢?辉县根据mix去找到member的下标,再根据max去找到member的下标,根据两个下标就可以得到个数;

值得一提的是,我们可以给min或者max加上一个(),用来把区间变成开区间,如果要去掉min,在min前加上一个( ,也就是zcount key ( min max,区间就变成了(min,max];有趣的是如果你要去掉max,就不是在max后面加上一个),而且是在max前加上一个( ,也就zcount key (min (max;我们都说一个语法如果要让人容易学的话,就要符合直观的感受,但是显然这个就有点让人难以接受,但是一想又还好,加上( 就是开区间嘛;

5、zrange key start end [withscores]

        只是就是去查下标是start到end的member,并返回member,如果加上withscores,就会把member的score也一起返回;为什么说是下标的呢?因为我们知道zset其实是有顺序的,是会按照score排序的,所以redis也会他们一个下标,作为排名,可以理解是排名的

6、 zrevrange key start end [withscores]

        这个指令的作用实际和zrange一致,只是range是按照升序的返回,而zrevrange是按照升序返回的,仅此而且;

7、zrangebyscore key min max [withscores]

        相信从zrangebyscore可以看出来就是按照给的min,max作为分数范围去获取这个分数范围的member,甚至返回他的score;返回的顺序就是按照降序的顺序,也就是按照redis实现的zset默认的排序顺序;

8、zpopmax key [count]

        这个指令指查找key中的score最大的count个member,删除之后并且返回member以及score,如果有指定count,那就是删除count个,如果没有,就是默认删除并返回一个;

9、bzpopmax key [key ...] timeout

        这个指令是带有阻塞等待功能的删除并返回最大的socre的元素,timeout就是等待的时间,整数的话就是秒,如果是小数,那就表示毫秒;他可以一次性的监听一个甚至多个key,如果监听的多个key都没有元素,就会一直等待,直到有一个key中有member,就停止等待,并且立即删除这个元素,并且返回member以及score;

既然有出队的最大的元素,那就有出队最小的元素的指令,比如zpopmin,以及带有阻塞功能的bzpopmin,用法以及功能跟zpopmax,bzpopmax一致;

10、zrank key member

        rank是排名的意思,这个指令就是去获取member的排名,下标,根据默认的升序,最小的0;

11、zrevrank key member

        这个指令就是按照降序的方式去获取member的下标,也及时排名,如果他是最大的,返回的就是0,以此类推;

12、zscore key member

        这个指令就是去获取member的score,获取member的score,时间复杂度是O(logN),但是redis在实现的时候就考虑到这个点会被频繁使用,所以就针对这个指令进行优化,牺牲空间复杂度来提高时间复杂度,时间复杂度达到了O(1);

13、zrem key member [member]

        可以一次性的删除一个或者多个member,返回成功删除的个数,时间复杂度就是O(logN*M),M指的是删除的个数,logN是查找并删除一个的时间复杂度;

14、zremrangebyrank key start end

        这个是根据排名的范围去删除member,下标可以是负数,也可以是超越长度的数,redis并不是你的排名给你的不合法而报错,而是会尽可能的正确的处理你给的排名;

15、zincrby key value member

        这个指令主要是对member对应的score进行加减操作,如果value是正数,那就是加操作,如果是负数,那就是减操作,返回值就是加减后的socre;并且支持双精度浮点数,可以加减小数;如果操作的member不存在,那就会以value和member去创建一个新的member score这样一个pair;

16、ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

注意zinter,zunion,zdiff这个命令是从redis6.2才开始有的,而zinterstore等这几个是从redis5就支持的,zinterstore是求交集,是将结果保存到另一个key中;zunionstore是求交集,是将结果保存到另一个key中;zdiffstore是求交集,是将结果保存到另一个key中;接下来就主要讲一个zinterstore,其他两个指令的用法是一致的,就不做赘述;

交集,并集,差集计算都会产生一个结果,destination就是用存这个结果集的zset;

numkeys是一个整数,用来表示有几个zset参与交集运算,也就是后面跟的key的个数,很多人可能有疑问,为什么要有这样一个整数来表示呢?难不成是因为有多个key吗?但是我们前面所学到的指令也有相当多是有多个key参与运算的,为什么其他的就不用有numkeys这样一个整数来表示呢?关于这个问题,redis官方也是做出了解释:

他是这么说的:要强制提供一个numkeys在多个输入的key和其他参数之前;实际目的就是为了知道到底有多少个key参与运算,有这个numkeys就不会把后面的其他参数当做key参与运算,虽然后面的参数不一定有,但是一但有就会而且没有这个numkeys就会出错,所以一定要加上这个numkeys;其实说到这里,大家可能会联想到两个知识点,一个是http协议的content-length,这个用来记录的是正文的长度,http协议主要分为四个部分,首行、请求头(键值对)、空行、正文,如果没有content-length正确记录正文的长度,那就看会出现“粘包问题”;http协议是使用tcp协议的进行传输的,从http3.0开始才开始使用udp协议进行传输,而tcp协议就是使用字节流进行传输的,所以只要是使用字节流这样的IO方式进行传输的,就一定会出现“粘包问题”,所以一定要有方法去避免这样的问题;

weights在这里的意思是:权重,用途就是“综合考虑”,就是说一个元素是重要的,但是相比较其他的元素就没有那么重要的,所以重要的我们就给更大的权重值,比较不重要的就给一个不那么大的权重值;这里参与运算的集合都是有序集合,特殊的就是每一个member都有一个score,这里的权重就相当与一个系数,每一个score都会乘上这个系数,来参与运算;

AGGREGATE <SUM | MIN | MAX>:经过权重计算之后,每一个key都会有一个不同的score,比如求的是交集,那么两个key都会有一个相同的member,可能member的score就不一样,那我们要如何决定要用那个score来当做要存入的key的score呢?如果是sum,那就是表示两个key的score相加当做存入的key的score,如果是min,那就是用最小的score,如果是max,那就是用比较大的score,这里还是比较好理解的;

这么说的话还是比较抽象的,可能会觉得很难,但是实际并不难,接下来就真正的结合例子来说明一下

先使用一个最简单的指令来看一下效果:zinterstore key3  2 key1 key2

可以看到求交集后的key的score是他们的score的和,也就说如果不指定AGGREGATE,那就是默认sum;

接下来我们加上权重参数,并指定要min(可以是小数)

key1的所有socre都乘上2,key2的所有socre都乘上3,难免key1的score就是20,40,60,key2的score就是45,75,90,又要求取小的,所以结果就是20,40,60;

结合以上的两个例子,相信已经理解这个指令所有参数的意思了;

这个指令的时间复杂度是:O(N*K)+O(M+logM),N指的是最短的zset的长度,K是参与运算的zset的个数,M指的是要结果集的个数;

Redis 五大数据类型(String、List、Hash、Set 及 Zset) 文章目录一、String 数据类型1.概述2.命令示例2.1 EXISTE、APPEND、GET、SET、STRLEN2.2 INCR、DECR、DEL、INCRBY、DECRBY2.3 GETSET、SETEX、TTL、SETNX2.4 SETRANGE、GETRANGE2.5 MSET、MGET、MSETNX二、List 数据类型1.概述2.命令示例2.1 LPUSH、LPUSHX、LRANGE、LPOP/LIEN2.2 LREM、LSET、LINDEX、LTRIM2.4 LINSERT2.5 RPUS 阅读详情

相关推荐

告别MATLAB!用Python的PYPOWER搞定电力系统潮流计算(附Case30完整代码)

本文介绍了如何从MATLAB迁移到Python,使用PYPOWER工具包进行电力系统潮流计算。通过详细的环境准备、数据接口兼容性实践、潮流计算实现及最优潮流计算进阶,帮助工程师和学生无缝过渡到Python生态。文章还展示了结果处理与可视化技巧,并附有Case30完整代码示例。

weixin_30411819的博客 298

Redis 有序集合(Zset)详解

Redis 中的有序集合(Sorted Set,简称 Zset)是一种非常强大且灵活的数据结构。它结合了哈希表和跳跃列表(Skip List)或压缩列表(Ziplist)的优点,能够高效地执行插入、删除以及范围查询操作。与普通集合不同的是,有序集合中的每个元素都有一个分数(score),这个分数用来对集合内的元素进行排序。

Y_1215的博客 1655

VMware桥接模式实战:用手机热点给Linux虚拟机共享网络(附WiFi适配技巧)

本文详细介绍了在移动办公场景下,如何为VMware中的Linux虚拟机配置桥接模式,以通过手机热点共享网络。文章深入解析了桥接模式在无线环境下的工作原理,提供了从主机端准备、VMware设置到Linux虚拟机内部配置的完整实战步骤,并针对手机热点的特殊性,分享了MTU优化、DNS配置及常见网络问题的诊断与解决方案,帮助用户实现稳定高效的移动虚拟化办公。

2y3u4i5o6p的博客 1196

Python数据挖掘赋能智慧教学监控,redis-zset数据类型的常见指令(sorted set)。

教学监控系统采用三层架构:数据采集层、数据处理层和应用展示层。数据处理层基于Python的Pandas、NumPy和Scikit-learn库进行数据清洗、特征工程和模型训练。数据存储采用MySQL关系型数据库存储结构化数据,MongoDB存储非结构化日志数据。系统通过Redis实现实时数据缓存,提升响应速度。监控系统集成Prometheus和Grafana,实时跟踪CPU、内存和API响应时间等指标。系统产生的分析报告为教学改革提供数据支持,包括课程调整建议、个性化辅导方案和教学资源优化配置。

jq00gazx的博客 97

Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)

以Carla官网导入RoadRunner地图的标准文档为参考,里面增添了很多细节和注意事项,遇到问题的小伙伴过来看看吧。

DSK_981029的博客 1万+

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 283

redis zset 内部的实现原理

Redis对象 Redis对象由redisObject结构体表示。 1 2 3 4 5 6 7 typedef struct redisObject { unsigned type:4; // 对象的类型,包括 /* Object types */ unsigned e...

李意成的博客 2万+

智慧城市项目实战:如何将你的地理数据从城市坐标系(如上海2000)转换到国家CGCS2000?

本文详细介绍了智慧城市项目中地理数据坐标系转换的全流程解决方案,重点讲解如何将城市坐标系(如上海2000)转换到国家CGCS2000。通过七参数布尔莎模型、ArcGIS Pro、QGIS开源方案及Python编程实现,帮助实施团队解决坐标系不统一的技术难题,确保空间分析精度。

weixin_28725949的博客 307

redis学习——Sorted Set(Zset)数据类型

一、概述: Sorted Set(有序集合)和Set类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted Set中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted Set中的成员必须是唯一的,但是分数(score)却是可以重复的。 (有序集合中的元素不可以重复,但是score 分数 可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同)。 在Sort

weixin_44096353的博客 1216

激光雷达-IMU标定工具lidar_imu_calib保姆级教程(VLP-16实测)

本文提供激光雷达与IMU联合标定的详细实战教程,重点解析lidar_imu_calib工具在VLP-16上的应用。从环境部署、数据采集技巧到参数配置与结果验证,手把手指导完成标定全流程,并详解如何在LIO-SAM等SLAM系统中应用标定结果,确保传感器融合精度。

food6的博客 475

【异常】CNB提示The bill authorization scope cannot access the current request.

摘要:CNB API返回403错误,表明当前token的授权范围无法访问目标仓库。主要原因是:1) REPO_SLUG填写错误,导致资源地址不匹配;2) CNB_TOKEN未授权目标仓库;3) 账号账单状态异常。解决步骤:先检查REPO_SLUG是否与CNB平台仓库地址完全一致;再确认CNB_TOKEN是否绑定目标仓库且有读取权限;最后检查账号账单是否正常且覆盖目标资源。完成排查后更新配置即可解决此授权问题。

奶爸的编程之路,也就一周冷个三天 663

Redis常用数据结构以及多并发场景下的使用分析:Sorted Set(ZSet)类型

这篇文章分析了Redis中的Sorted List(有序集合)数据结构。其底层实现根据数据量大小采用两种方式:元素较少时使用压缩列表(ziplist),元素较多时采用跳表(skiplist)结合哈希表的双结构设计。跳表通过多层索引实现高效的范围查询和排序,时间复杂度为O(log n),相比平衡树实现更简单且性能稳定。文章还通过示例演示了跳表的插入过程,并对比了跳表与其他数据结构的优势。

qq_44716086的博客 1248

EMC意义下的共模(Common Mode)和差模(Differential Mode)

在电子产品中,信号或电源通过两根导线传输。对比维度差模(DM)共模(CM)电流方向一进一出,相等相反同向、相等回流路径两根导线组成的闭合回路地或外壳EMC影响较小容易辐射干扰,重点治理类型定义有用信号干扰信号抑制方法常规滤波器、电感、电容共模电感、磁环、屏蔽、接地技术等。

weixin_43199439的博客 1248

Redis数据类型——zset(sorted set)

简介 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式 需要的存储结构:新的存储模型,可以保存可排序的数据 sorted_set类型:在set的存储结构基础上添加可排序字段 数据结构 它类似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一...

qq_43284141的博客 859

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Redis的数据类型介绍

​ 【1】键不能重复​ 【2】作用:标识存储的数据​ 【3】数据类型:string​ 【4】命名规则:​ 1)不能太长:因为查询的效率低,查询起来不方便​ 2)不能太短:容易重复,同时可读性也差​ 3)按照规范:HEIMA_STU_LIST**值(value):**支持5种数据类型值的数据类型值的格式说明string字符串类型,类似于Java中Stringhash由键值对组成,类似于Java中Maplist列表类型,类似于Java中List,元素是存取有序,可以重复。

几许的博客 2495

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Redis篇】Set和Zset 有序集合基本使用

S。

m0_74823094的博客 1392

redis基本数据类型之zset

redis基本数据类型之zset

eugene03的博客 1941

redis 2.key及其命令,value的五种数据类型String List Set Hash Zset及其命令

文章目录一.redis常用五大数据类型1.1 key(1) 按模式匹配对应的key(2) 判断key是否存在(3) 查看key的类型(4) 删除指定的key(5) 根据value选择非阻塞删除(6) 为给定的key设置过期时间(单位 秒)(7) 查看key还有多少秒过期,-1表示永不过期,-2表示已过期1.2 redis原子性1.3 String1.3.1 简介1.3.2 常用命令(1) 添加键值对(2) 查询对应键值(3) 将给定的 追加到原值的末尾(4) 获得值的长度(5) 将 key 中储存的数字值增

不是一枚开发 5万+

Redis:数据结构与基础操作(String、List、Hash、Set、Sorted Set)

String 是 Redis 中最基础、最常用的数据结构。它是二进制安全的,也就是说可以存储任意类型的数据,例如:普通字符串整数、浮点数图片(Base64 编码后)JSON / 序列化对象 / 二进制内容。

m0_73341242的博客 1313

四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)

在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。

weixin_61635597的博客 1583

3. Redis(String,Stream,List,Set,Zset,Hash)

常用五大数据类型 9大类型:String(字符类型)、Hash(散列类型)、List(列表类型)、Set(集合类型)、SortedSet(有序集合类型,简称zset)、Bitmap(位图)、HyperLogLog(统计)、GEO(地理)、Stream Stream(了解即可) Redis Stream是 Redis 5.0 版本新增加的数据结构 Redis Stream主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列.

lxsxkf的博客 1919

Redis的五种数据类型及应用场景

1,数据类型 String(字符串,整数,浮点数):做简单的键值对缓存 List(列表):储存一些列表类型的数据结构 Set(无序集合):交集,并集,差集的操作 Hash(包含键值对的无序散列表):结构化的数据 Zset(有序集合)(Sorted sets):去重同时也可以排序, 1,String ​ String是redis最基本的数据类型,一个key对应一个value。redis的String可以表示任何数据。比如jpg图像或者序列化对象,String的最大储存值未512MB。

陆卿之的博客 2万+

zset和sorted set区别

在RedisTemplate中,和ZADDZRANGEZREMZSCORE。

weixin_39304656的博客 900

Redis系列(六)、数据类型之有序集合ZSet(sorted_set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 常应用于排行榜,分数排名等场景。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

王义凯 的博客 2228

Spring Data Redis 如何使用ZSet(sorted set)实现分页查询

在 Redis 中,ZSet(有序集合)是一种非常有用的数据结构,它允许我们存储一组唯一的成员,并为每个成员分配一个分数,这使得成员可以按照分数进行排序。虽然 ZSet 并没有直接提供分页功能,但我们可以通过结合使用 zRange 命令和客户端代码来实现分页效果

weixin_58936212的博客 1464

四、Redis数据存储list与set与Zset(sorted set:有序集合)

list类型 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序 list类型:保存多个数据,底层使用双向链表存储结构实现 ...

weixin_35099248的博客 4128
上一篇: redis的set集合的编码方式以及应用场景
下一篇: 使用Java连接redis以及开放redis端口的问题
a添砖Java
博客等级 码龄4年 498粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a添砖Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值