Redis:zset类型

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.mfbz.cn/a/887192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机的两种看门狗原理解析——IWDG和WWDG

一、IWDG独立开门狗的主要性能 计时机制&#xff1a; 递减计数器 独立开门狗的初始频率&#xff1a; LSI低速内部时钟&#xff1a;RC震荡器&#xff0c;40kHz 独立开门狗是以LSI为初始频率的&#xff0c;所以独立开门狗的初始时钟频率取决与单片机本身&#xff0c;因此在使…

[每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别

文章目录 1. **支持的磁盘容量**2. **分区数量**3. **引导方式**4. **冗余和数据恢复**5. **兼容性**6. **安全性**7. **操作系统支持**8. 对比 国庆假期前补一篇 在一次扫描机械硬盘故障的问题&#xff0c;发现我本机SSD和机械硬盘的分类型不一样&#xff0c;分别是GPT和MBR&a…

Matlab编程示例24:freexyn在b站的读取手写体mnist数据集的matlab代码

1.mnist手写体数据集介绍 手写数字MNIST数据库由60000个示例的训练集和10000个示例的测试集组成。这些数字已进行归一化&#xff0c;每个示例是28*28像素的图片&#xff0c;图片是黑底白字&#xff0c;每个图片的标签就是图片上的数字&#xff0c;数字范围是0~9&#xff0c;总…

记录一次病毒启动脚本

在第一次下载软件时&#xff0c;目录中配了一个使用说明&#xff0c;说是需要通过start.bat 这个文件来启动程序&#xff0c;而这个 start.bat 就是始作俑者&#xff1a; 病毒作者比较狡猾&#xff0c;其中start.bat 用记事本打开是乱码&#xff0c;但是可以通过将这个批处理…

小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户 注册…

探索 Python 虚拟环境的奥秘:virtualenv 的魔法世界

文章目录 探索 Python 虚拟环境的奥秘&#xff1a;virtualenv 的魔法世界背景&#xff1a;为何选择 virtualenv&#xff1f;虚拟环境的守护者&#xff1a;virtualenv 是什么&#xff1f;安装 virtualenv&#xff1a;简单几步&#xff0c;开启隔离之旅掌握 virtualenv 的基本用法…

LC刷题专题:堆、大顶堆、小顶堆

文章目录 692. 前K个高频单词215. 数组中的第K个最大元素2336、无限集中的最小数字 这篇文章以后记录自己刷到的题目中与堆有关的。 692. 前K个高频单词 这个题目整体不难&#xff0c;是前k个高频元素的改进版&#xff0c;只需要在创建小顶堆时执行排序规则即可。如果出现次数…

镜头、diffuser、DOE

三种常见的光学器件&#xff1a;镜头、扩散器&#xff08;diffuser&#xff09;、衍射光学元件&#xff08;DOE&#xff09; lensdiffuserDOE镜头扩散器衍射光学器件作用聚焦或发散均匀化光束生成特定形状的光斑应用领域TOF结构光算法 1.1 镜头&#xff08;Lens&#xff09; …

微服务_3.微服务保护

文章目录 一、微服务雪崩及解决方法1.1、超时处理1.2、仓壁模式1.3、断路器1.4、限流 二、Sentinel2.1、流量控制2.1.1、普通限流2.1.2、热点参数限流 2.2、线程隔离2.3、熔断降级2.3.1、断路器状态机2.3.2、断路器熔断策略2.3.2.1、慢调用2.3.2.2、异常比例&#xff0c;异常数…

(12)MATLAB莱斯(Rician)衰落信道仿真2补充:莱斯衰落信道与莱斯随机变量

文章目录 前言1.关于莱斯衰落信道仿真的两个公式2.由式&#xff08;1&#xff09;推出式&#xff08;2&#xff09; 前言 本文给出关于莱斯衰落信道仿真的两个公式之间的推导。 1.关于莱斯衰落信道仿真的两个公式 在上一篇《&#xff08;11&#xff09;MATLAB莱斯&#xff08…

产品经理产出的原型设计 - 需求文档应该怎么制作?

需求文档&#xff0c;产品经理最终产出的文档&#xff0c;也是产品设计最终的表述形式。本次分享呢&#xff0c;就是介绍如何写好一份需求文档。 所有元件均可复用&#xff0c;可作为管理端原型设计模板&#xff0c;按照实际项目需求进行功能拓展。有需要的话可分享源文件。 …

Origin正态分布检验

在spass中用Shapiro-Wilk检验--正态分布检测 Shapiro-Wilk检验--正态分布检测_spss shapiro-wilk检验-CSDN博客

用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画

总得拆开炼丹炉看看是什么样的。这篇文章将带你从代码层面一步步实现 AI 文本生成图像&#xff08;Text-to-Image&#xff09;中的 LoRA 微调过程&#xff0c;你将&#xff1a; 了解 Trigger Words&#xff08;触发词&#xff09;到底是什么&#xff0c;以及它们如何影响生成结…

HTTPS协议简单介绍

HTTP协议简单介绍HTTP协议简单介绍-CSDN博客 目录 一、对称加密和非对称加密 对称加密 非对称加密 总结 二、HTTPS协议 定义 关键特点 工作原理 详细通信过程 1. 客户端请求连接 2. 服务器响应 3. 密钥交换 4. 加密通信 5. 关闭连接 ​编辑 优势 缺点 1. 性能…

leetcode35--搜索插入位置--二分查找刷题

搜索插入位置 一共会出现下面四种情况&#xff1a; 目标值在数组所有元素之前 目标值等于数组中某一个元素 目标值插入数组中的位置 目标值在数组所有元素之后 首先在二分查找的代码之前处理掉目标值在数组所有元素之前和之后的情况如果目标值在数组中的某个位置&#xff0c…

setTimeout,setInterval ,requestAnimationFrame定时器

setTimeout&#xff0c;setInterval &#xff0c;requestAnimationFrame定时器 定时器函数通常用于执行定时任务&#xff0c;也就是说你做了一个功能放在定时器函数里&#xff0c;它可以在特定的时间去执行你的指令&#xff0c;或者说隔多长时间&#xff08;单位时间内—毫秒为…

关于cefsharp访问iqiyi.com显示403 Forbidden解决办法(2种方法)

1.cefsharp浏览器访问iqiyi.com异常 (403 Forbidden) 403 Forbidden Q_DENY: Forbidden by iQIYI WAF! Any problem, contact iQIYI Security Group (security-help). Request ID: c0597b5aeead125907f7 2.解决办法(2种) 1)屏蔽掉 cefSettings.UserAgent2)修改 cefSettings…

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…

.NET Core 高性能并发编程

一、高性能大并发架构设计 .NET Core 是一个高性能、可扩展的开发框架&#xff0c;可以用于构建各种类型的应用程序&#xff0c;包括高性能大并发应用程序。为了设计和开发高性能大并发 .NET Core 应用程序&#xff0c;需要考虑以下几个方面&#xff1a; 1. 异步编程 异步编程…

开发环境简单介绍

目录 开发环境keil的安装和使用 keil的介绍 keil的安装 keil的简单使用 STC-ISP的安装 STC-ISP简单介绍 开发环境测试 总结 开发环境keil的安装和使用 keil的介绍 Keil uVision5是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于对嵌入式系统中的微控制器…