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.xdnf.cn/news/1555257.html

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

相关文章

【AIGC】ChatGPT提示词Prompt助力自媒体内容创作升级

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;高效仿写专家级文章提示词使用方法 &#x1f4af;CSDN博主账号分析提示词使用方法 &#x1f4af;自媒体爆款文案优化助手提示词使用方法 &#x1f4af;小结 &#x1f4af…

02基础篇:667的大题题型与应对策略

通过本节&#xff0c;你将学习到&#xff1a; 667分析题的考查方向与基本题型667分析题的两种解决策略 667分析题的三大基本题型 首先&#xff0c;通过回顾667科目分析题的真题&#xff08;2021-2024年&#xff09;&#xff0c;我根据题目特点将其归纳为三个主要类别。这样的…

【JavaWeb】javaweb目录结构简介【转】

以上图说明&#xff1a; bbs目录代表一个web应用bbs目录下的html,jsp文件可以直接被浏览器访问WEB-INF目录下的资源是不能直接被浏览器访问的web.xml文件是web程序的主要配置文件所有的classes文件都放在classes目录下jar文件放在lib目录下

Linux Cent7 已安装MySQL5.7.X,再安装MYSQL8.4.2

一、 下载安装 检查Linux系统的glibc版本rpm -qa | grep glibc结果&#xff1a;glibc-common-2.17-260.el7_6.6.x86_64 glibc-2.17-260.el7_6.6.x86_64 glibc-headers-2.17-260.el7_6.6.x86_64 glibc-devel-2.17-260.el7_6.6.x86_64访问MySQL官网&#xff0c;下载对应版本数据…

华为 HCIP-Datacom H12-821 题库 (32)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.当一个运行 MSTP 协议的交换设备端口收到一个配置BPDU 时&#xff0c;会与设备保存的全局配…

CF D. Minimize the Difference

原题链接&#xff1a;Problem - D - Codeforces 题意&#xff1a;给你长度为n的数组&#xff0c;可以无限次的让i位置的数-1&#xff0c;让i1的位置的数1。问最大值-最小值的最小值是多少&#xff1f; 思路&#xff1a;可以观察出&#xff0c;操作的真正意义是让i位置的数减少…

数字乡村智慧乡镇整体规划设计解决方案

1. 数字乡村的重要性 数字乡镇作为乡村振兴战略的一部分&#xff0c;通过信息化手段提高农业农村现代化水平&#xff0c;是建设数字中国的重要内容&#xff0c;对保障扶贫成果、促进乡村治理体系和治理能力现代化具有基础支撑作用。 2. 乡镇政府和农户面临的问题 乡镇政府和…

Linux 之 安装软件、GCC编译器、Linux 操作系统基础

安装软件、GCC编译器、Linux 操作系统基础 学习任务&#xff1a; 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…

电源管理芯片PMIC

一、简介 电源管理芯片&#xff08;Power Management Integrated Circuits&#xff0c;简称PMIC&#xff09;是一种集成电路&#xff0c;它的主要功能是在电子设备系统中对电能进行管理和控制&#xff0c;包括但不限于以下几点&#xff1a; 电压转换&#xff1a;将电源电压转换…

IndexTree、AC自动机

一、引言。 IndexTree和线段树有一些联系&#xff0c;这里我们再重新解释一下线段树用来解决什么样的一个问题&#xff0c;线段树解决的是一个区间查询和区间更新的一个问题&#xff0c;比如说我有一个数组在 L....R 上统一加上V&#xff0c;或者在L.....R上&#xff0c;统一所…

硬件设计-利用环路设计优化PLL的输出性能

目录 前言 问题描述 问题分析步骤 杂散源头排查 245.76M 参考相噪&#xff1a; 30.72M VCXO的相噪性能测试如下: 解决方案 前言 LMK04832是TI 新发布的低抖动双环去抖模拟时钟&#xff0c; 其最高输出频率可以到达3250MHz&#xff0c; 输出抖动极低&#xff0c;3200MHz…

Sentinel学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

Linux基本命令及vim应用实训练习

Linux基本命令及vim应用实训练习 1. 2. 3. 4. 5. 使用man cp找出

序列化与反序列化基础及反序列化漏洞(附案例)

参考文章&#xff1a; [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容&#xff0c;经常需要通过序列化对数据进行处理&#xff0c;将数据进行序列化后&#xff0c;会生成一个字符串&#xff0c;字符…

linux安装minianconda

文章目录 我的配置从清华镜像源里下载minianaconda安装自定义安装位置是否关闭打开终端默认进入anaconda的设置&#xff1f;&#x1f315;配置清华镜像源 我的配置 ubuntu 22.04LTS 从清华镜像源里下载minianaconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/minicond…

带你深入浅出设计模式:七、代理模式:设计模式中的中间人

此为设计模式第七谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;代理模式为其他对象提供一个代理来控制这个对象的访问&#xff0c…

openpnp - 坐标文件中的元件0角度如果和编带规定的角度不一样,需要调整贴片任务中的元件旋转角度

文章目录 openpnp - 坐标文件中的元件0角度如果和编带规定的角度不一样&#xff0c;需要调整贴片任务中的元件旋转角度笔记查看自己图纸中的封装的0角度方法贴片任务的角度值范围编带规定的0角度根据编带规定的元件0角度来调整贴片的元件旋转角度如果是托盘飞达备注备注END ope…

Python并发编程(3)——Python多线程详解介绍

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取python编程资料 Python 的多线程入门是非常简单的&#xff0c;直接导入threading模块就可以开始多线程之旅了。模…

弧形导轨驱动器高效使用技巧!

弧形导轨驱动器是一种用于驱动滑座沿着导轨做弧线运动的设备&#xff0c;其用方法因具体型号和应用场景的不同而有所差异&#xff0c;通常可以归纳为以下几个步骤&#xff1a; 1、安装前要明确弧形导轨的使用需求&#xff0c;根据需求选择合适的弧形导轨驱动器&#xff0c;准备…

深度学习基础—目标检测算法

目录 1.滑动窗口算法 2.滑动窗口的卷积实现 &#xff08;1&#xff09;1*1卷积的作用 &#xff08;2&#xff09;全连接层转化为卷积层 &#xff08;3&#xff09;在卷积层上实现滑动窗口 3.Bounding Box预测&#xff08;YOLO算法&#xff09; 1.滑动窗口算法 假如要构建一…