Redis:zset类型

news2024/10/5 23:04:26

Redis:zset类型

    • zset命令
        • ZADD
        • ZCARD
        • ZCOUNT
        • ZRANGE
        • ZREVRANGE
        • ZRANGEBYSCORE
        • ZREVRANGEBYSCORE
        • ZPOPMAX
        • BZPOPMAX
        • ZPOPMIN
        • BZPOPMIN
        • ZRANK
        • ZREVRANK
        • ZSCORE
        • ZREM
        • ZREMRANGEBYRANK
        • ZREMRANGEBYSCORE
        • ZINCRBY
      • 集合间操作
        • ZINRERSTORE
        • ZUNIONSTORE
    • 内部编码
      • ziplist
      • skiplist


Redis中,有两种集合类型,setzset,其中set是无序集合,zset是有序集合,本博客讲解Redis中的有序集合。

在有序集合中,要按照一定的指标给集合元素进行排序,Redis个每个集合的元素引入了一个score属性,这是一个双精度浮点型,每次排序的时候,依据socre的大小进行排序。如果分数相同,那么以字典序排序。


zset命令

ZADD
  • zset中添加元素和分数
zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]

选项:

  • [XX|NX]
    • XX:只更新,如果element或者key不存在,操作失败
    • NX:只添加,如果element或者key不存在,添加数据,如果存在,操作失败
  • [GT|LT]
    • LT:如果新的socre小于(Less Than)当前的score,那么更新元素
    • GT:如果新的socre大于(Greater Than)当前的score,那么更新元素
  • [CH]
    • 不加CHzadd返回新增的元素个数
    • 加CHzadd返回修改的元素个数
  • [INCR]:对现有的socre进行运算

示例:

在这里插入图片描述

此处插入了四个数据,随后通过zrange查询结果(后面讲),可以看到输出结果是以score排序的。

在这里插入图片描述

还可以通过zadd更新数值,把mike的值提升到80.5后,再次查询顺序就变了。

在这里插入图片描述

此处演示ch的功能,第一次先通过add添加了两个成员lorameg。第二次修改loramegscore,结果返回值为0,这不是说明修改失败了,而是其只返回新增元素个数,而不是修改的元素个数。第三次修改loramegscore,并且加入ch选项,返回2说明有两个元素修改成功了。

第一次通过zadd设置peterscore100,第二次添加incr选项,表示在当前的score基础上再加20,返回120为增加后的结果。


ZCARD
  • 获取zset的元素个数
zcard key

返回zset的元素个数。


ZCOUNT
  • 返回指定区间内的元素个数
zcount key min max

返回score[min, max]闭区间的元素个数,可以通过(min (max来设置开区间。

在这里插入图片描述

zset3中,有五个分数12 20 42 68 88。第一次查询20 68,在闭区间内有三个数值,返回3。第二次查询(20 68,表示左开右闭区间,第三次查询(20 (68表示开区间,第四次查询20 (68表示左闭右开区间。

此处实现计数,不是查询到minmax后,遍历区间内的元素然后计数。在zset内部,会给每个元素存储其当前的排名,查询到minmax后,直接将两者的排名做差就可以得到count

另外的,区间还支持浮点数的负无穷大-inf和正无穷大inf

在这里插入图片描述

这种格式就是统计zset中所有元素个数。


ZRANGE
  • 返回指定区间内的元素,按升序排序
zrange key start stop [withscores]

按升序返回[start, stop]区间内的元素,如果带上withscores则将score一起返回。

此处的startstop不是分数,而是元素的排名,从0开始,支持负数。

示例:

在这里插入图片描述

在这里插入图片描述

加上withcores参数后,每个元素的下一行是它的socre


ZREVRANGE
  • 返回指定区间内的元素,按降序排序
zrevrange key start stop [withscores]

按降序返回[start, stop]区间内的元素,如果带上withscores则将score一起返回。

此处的rev表示reverse翻转,只是将原先的输出顺序颠倒了一下,用法和zrange没有区别。


ZRANGEBYSCORE
  • 返回指定区间内的元素,按升序排序
zrangebyscore key min max [withscores]

按升序返回score[min, max]区间内的元素,如果带上withscores则将score一起返回。

之前的zrange是通过元素排名返回,zrangebyscore则是通过score区间返回。

示例:

在这里插入图片描述

注意:官方文档表明,该命令即将被废弃,并且功能会合并到zrange中。


ZREVRANGEBYSCORE
  • 返回指定区间内的元素,按降序排序
zrevrangebyscore key min max [withscores]

按降序返回score[min, max]区间内的元素,如果带上withscores则将score一起返回。

只是将输出顺序颠倒了一下,用法和zrangebyscore一样。

注意:官方文档表明,该命令即将被废弃,并且功能会合并到zrevrange中。


ZPOPMAX
  • 获取并删除score最高的多个元素
zpopmax key [count]

返回当前的count个最大元素,并且将这些元素从zset中删除。

示例:

在这里插入图片描述

如果多个元素的score相同,那么会按照member的字典序进行比较,字典序高的先删除。


BZPOPMAX
  • 读取并删除zset最大元素,如果没有元素则陷入阻塞
bzpopmax key [key ...] timeout

bzpopmax 可以同时指定多个key,也就是多个zset,只要任何一个zset有数据,就返回结果。还可以设置超时时间timeout,以秒为单位,如果超过时间了,返回nil

如果超时时间设置为0,则一直阻塞,不会超时。

示例:

在这里插入图片描述

此处启动了两个终端,左侧终端通过bzpopmax读取zset1的最大值。但是由于zset1内没有元素陷入阻塞。不久后在右侧终端插入66 lisa,此时左侧终端检测到后,立刻返回结果。zset1表示自己读取到的数据属于哪一个zsetlisamember66score


ZPOPMIN
  • 获取并删除score最小的多个元素
zpopmin key [count]

返回当前的count个最小元素,并且将这些元素从zset中删除。


BZPOPMIN
  • 读取并删除zset最小元素,如果没有元素则陷入阻塞
bzpopmin key [key ...] timeout

bzpopmin 可以同时指定多个key,也就是多个zset,只要任何一个zset有数据,就返回结果。还可以设置超时时间timeout,以秒为单位,如果超过时间了,返回nil

如果超时时间设置为0,则一直阻塞,不会超时。


ZRANK
  • 获取指定元素的排名
zrank key member

返回指定元素member的排名,这个排名就是socre小到大的顺序,从0开始排,也可以当作下标。

示例:

在这里插入图片描述

此处排名最前的是lisa,下标为0


ZREVRANK
  • 获取指定元素的排名
zrevrank key member

返回指定元素member的排名,这个排名就是socre大到小的顺序,从0开始排。

示例:

在这里插入图片描述


ZSCORE
  • 获取指定元素的分数
zscore key member

返回指定元素member的分数。


ZREM
  • 删除指定元素
zrem key member [member ...]

返回成功删除的元素个数。


ZREMRANGEBYRANK
  • 根据排名,删除指定区间内的元素
zremrangebyrank key start stop

删除排名在[start, stop]闭区间范围内的元素,返回成功删除的元素个数。

示例:

在这里插入图片描述


ZREMRANGEBYSCORE
  • 根据score,删除指定区间内的元素
zremrangebyscore key min max

删除分数在[min, max]闭区间范围内的元素,返回成功删除的元素个数。

示例:

在这里插入图片描述


ZINCRBY
  • 为指定元素的score增加指定的值
zincrby key increment member

memberscore增加increment的值,返回增加后的结果,increment可以为负值和浮点数。


集合间操作

set中,提供了sintersunionsdiff处理交集、并集、差集。那么zset是否也有对应的zinterzunionzdiff?是有的,但是在Redis 6.2后才开始支持,在那之前,zset只提供了两个集合间操作。

ZINRERSTORE
  • 求多个集合的交集,结果保存到指定zset
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate <sum | min | max>]
  • destination :输出结果到给zset
  • numkeys:指定后续输入的key的个数
  • weights:权重,每一个zset都配一个weight,计算时score乘对应的weight
  • aggreatescore的合并方式
    • sum:求和(默认值)
    • min:取最小
    • max:取最大

示例:

在这里插入图片描述

此处创建了两个zset,通过zinterstore合并,其中zset1的权重是1zset2的权重是100,以sum方式合并。最后求出交集bob 1 * 100 + 20lisa 3 * 100 + 12


ZUNIONSTORE
  • 求多个集合的并集,结果保存到指定zset
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate <sum | min | max>]

这个参数和zinterstore完全一致,只是从交集变成并集。


  • 总结:
命令功能
zaddzset中添加元素和分数
zcard获取zset的元素个数
zcount计算在指定分数范围内的元素个数
zrange获取指定区间内的元素
zrevrange获取指定区间内的元素(按分数从高到低)
zrangebyscore获取指定分数范围内的元素
zrevrangebyscore获取指定分数范围内的元素(按分数从高到低)
zpopmax弹出zset中分数最高的元素
bzpopmax阻塞弹出zset中分数最高的元素
zpopmin弹出zset中分数最低的元素
bzpopmin阻塞弹出zset中分数最低的元素
zrank获取元素在zset中的排名(按分数从小到大)
zrevrank获取元素在zset中的排名(按分数从大到小)
zscore获取元素在zset中的分数
zrem移除zset中的一个或多个元素
zremrangebyrank移除zset中给定排名区间的元素
zremrangebyscore移除zset中给定分数区间的元素
zincrby增加zset中元素的分数
zinterstore计算两个或多个zset的交集,并将结果存储在新的zset
zunionstore计算两个或多个zset的并集,并将结果存储在新的zset

内部编码

ziplist

当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都⼩于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使⽤。


skiplist

当ziplist条件不满⾜时,有序集合会使用skiplist作为内部实现,因为此时ziplist的操作效率会下降。

跳表是一种搜索结构,搜索时间复杂度为O(lgN),与平衡二叉搜索树是一个级别。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (362)-- 算法导论24.3 4题

四、Gaedel 教授写了一个程序&#xff0c;他声称该程序实现了 Dijkstra 算法。对于每个结点 v ∈ V v∈V v∈V,该程序生成值 u . d u.d u.d 和 v . π v.π v.π 。请给出一个时间复杂度为 O ( V E ) O(VE) O(VE) 的算法来检查教授所编写程序的输出。该算法应该判断每个结…

安卓AI女友项目之安卓AI虚拟数字人整合开发

第9章 安卓AI虚拟数字人整合开发 在人工智能技术的推动下&#xff0c;创建具有交互能力的虚拟数字人已成为现实。本章将指导你如何在安卓平台上整合开发一个AI虚拟数字人应用&#xff0c;包括文字与语音的切换、按住说话输入、与ChatGPT进行文字及语音对话、滑动选择不同虚拟人…

算法篇1:双指针思想的运用(1)--C++

一.算法解析 双指针&#xff0c;顾名思义就是两个指针&#xff0c;常见的算法中&#xff0c;我们可以看到两种&#xff1a; 1.对撞指针&#xff1a;一般用于顺序结构&#xff0c;也称为左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端…

Tkinter打包成EXE安装文件

打包成 .exe可执行文件 1. 安装PyInstaller&#xff0c;命令如下&#xff1a; pip install pyinstaller2. 编写你的Tkinter应用程序&#xff1a; 创建一个Python文件&#xff0c;例如app.py&#xff0c;并写入你的Tkinter代码。 3. 在 app.py 文件所在的目录使用PyInstaller…

系统架构设计师⑤:系统性能

系统架构设计师⑤&#xff1a;系统性能 系统的性能指标主要分为2个方面&#xff1a;硬件和软件。 性能指标计算 关键词描述&#xff1a; ①平均每条指令的平均时钟周期个数(CPl&#xff0c;clockperinstruction) ②每(时钟)周期运行指令条数(IPC&#xff0c;instructionper…

OpenCV透视变换

#透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(coins.jpg,1)imgInfo img.shape height imgInfo[0] width imgInfo[1] #src 4->dst 4 (左上角 左下角 右上角 右下角) matSrc np.float32([[200,100],[200,400],[600,100],[wid…

数据驱动投资:AI在股票市场的应用

当ChatGPT首次亮相时&#xff0c;其卓越的语言处理能力立刻引起了许多行业的广泛关注&#xff0c;投资界也不例外。关于ChatGPT是否能应用于投资决策的问题&#xff0c;迅速成为热门讨论的焦点。 近期&#xff0c;加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…

Mysql:数据库和表增删查改基本语句

一、数据库操作 1&#xff09;、数据库创建 创建数据库本质就是创建一个目录&#xff08;ubuntu&#xff0c;创建的目录文件存放在/var/lib/mysql&#xff09;&#xff1b;后续创建表本质就是在该目录下创建文件&#xff08;不同存储引擎&#xff0c;会创建的文件数目是不同的…

Linux进程概念2

前言 1. Linux真实的调度算法 首先cpu中有一个叫做runqueue的东西&#xff0c;这个东西就是去弄进程的调度的&#xff0c;里面有很多东西&#xff0c;这里我们就写这些了 其中task_struct*这个数组指向的是140个元素&#xff0c;其中0~99就是系统默认的进程&#xff0c;后面的…

ARM assembly: lesson 11

在之前&#xff0c;我们提到&#xff0c;当函数的参数小于等于4个时&#xff0c;我们会把它存放于寄存器中&#xff0c;但是如果函数参数大于4个&#xff0c;我们就需要通过stack去进行参数的存储,这毫无疑问&#xff0c;将增加代码操作的复杂性&#xff0c;因为我们需要对于栈…

国外透明代理IP解析:匿名性的全貌

网络世界中&#xff0c;透明代理IP是一个广受关注的话题。究竟什么国外透明代理IP&#xff1f;以及它的匿名性如何&#xff1f;本文将深入解析透明代理IP的定义及其匿名性&#xff0c;为您呈现一个清晰的认识。 1. 概念 透明代理IP是指在进行网络请求时&#xff0c;客户端&am…

(数据结构与算法)哈希表

哈希表把他当成一个key-values表

鸿蒙harmonyos next flutter混合开发之开发plugin(获取操作系统版本号)

创建Plugin为my_plugin flutter create --org com.example --templateplugin --platformsandroid,ios,ohos my_plugin 创建Application为my_application flutter create --org com.example my_application flutter_application引用flutter_plugin&#xff0c;在pubspec.yam…

梯度下降学习

前言&#xff1a;初步学习梯度下降&#xff0c; 不断根据梯度修改我们的参数&#xff0c;经过多次轮次得到使得我们损失函数最小的时候参数&#xff0c;后续我们可以通过类似的道理&#xff0c;更新我们的参数 假设我们的损失函数是 y x 1 2 x 2 2 y x1^2 x2^2 yx12x22,我…

什么是 HTTP Get + Preflight 请求

当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时&#xff0c;意味着该请求涉及跨域资源共享 (CORS)&#xff0c;并且该请求被预检了。理解这种请求的背景&#xff0c;主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …

常用排序算法(下)

目录 2.5 冒泡排序 2.6 快速排序 2.6 1 快速排序思路 详细步骤 2.6 2 快速排序递归实现 2.6 3快速排序非递归&#xff1a; 快排非递归的优势 非递归思路 1. 初始化栈 2. 将整个数组的起始和结束索引入栈 3. 循环处理栈中的子数组边界 4. 单趟排序 5. 处理分区后的子…

Linux驱动开发(速记版)--热插拔

第九十六章 热插拔简介 热插拔是指在设备运行时安全地插入或拔出硬件&#xff0c;无需关闭或重启系统。 它提供了方便性和灵活性&#xff0c;允许快速更换或添加硬件而无需中断任务。 以下是一些应用场景及支持热插拔所需的条件&#xff1a; 应用场景&#xff1a; USB设备&…

python中,try-except捕获异常的意义(通过ai智库学习)

python中&#xff0c;不但可以用try-except捕获异常&#xff0c; 还可以自定义异常提示字符串&#xff0c;更可以自定义捕获异常后的处置。 (笔记模板由python脚本于2024年10月03日 06:47:06创建&#xff0c;本篇笔记适合喜欢研究python的coder翻阅) 【学习的细节是欢悦的历程】…

交叠型双重差分法

交叠型双重差分法&#xff08;Staggered Difference-in-Differences, Staggered DiD&#xff09;是一种扩展的双重差分&#xff08;Difference-in-Differences, DiD&#xff09;方法&#xff0c;用于处理多个时间点的政策干预或处理组&#xff08;treatment group&#xff09;并…

每日读则推(四)

Whats this...? | An invitation letter n.邀请函 n.邀请(invite v.邀请) Can a tool grasp the meaning in a song? v. 握紧,理解 n.紧握,理解(力) Can it feel the melody, where emotions belong? …