Redis - Zset 有序集合

前言

        它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个 分数。

        

        有序集合中的元素是不能重复的,但分数允许重复。类⽐于⼀次考试之后,每个人的学号不同,但分数可以相同

列表、集合、有序集合三者的异同点

命令

ZADD 添加或者更新指定的元素以及关联的分数

        添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的

ZADD 的相关选项:

  • XX:仅仅⽤于更新已经存在的元素,不会添加新元素。(当元素不存在则没有效果)
  • NX:仅⽤于添加新元素,不会更新已经存在的元素。(当元素存在则没有效果)
  • CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会包含本次更新的元素的个数。
  • INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。

        在未添加选项的情况下,ZADD 返回的是本次添加成功的元素个数,当元素不存在就创建,存在就更新分数

语法

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]

时间复杂度:O(log(N)) 

返回值:本次添加成功的元素个数

示例:

无选项:

XX:

NX:

CH:

INCR:

 

ZRANGE 返回指定区间里的元素(分数按照升序)

        带上 WITHSCORES 可以把分数也返回。分数按照升序,代表最小的数对应的下标为 0 

语法

ZRANGE key start stop [WITHSCORES]

此处是 [start, stop] 为下标构成的区间. 从 0 开始, ⽀持负数.

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表

示例:

ZREVRANGE 返回指定区间里的元素(分数按照降序)

        带上 WITHSCORES 可以把分数也返回。分数按照降序,代表最大的数对应的下标为 0 

语法

ZREVRANGE key start stop [WITHSCORES]

此处是 [start, stop] 为下标构成的区间. 从 0 开始, ⽀持负数.

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表

示例:

ZRANGEBYSCORE 返回在指定分数范围内的元素

语法

ZRANGEBYSCORE key min max [WITHSCORES]

        返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。

时间复杂度:O(log(N)+M)

返回值:区间内的元素列表

示例:

无 (

有 (

ZPOPMAX 删除并返回分数最高的 count 个元素

语法

ZPOPMAX key [count]

时间复杂度:O(log(N)*M)

返回值:分数和元素列表

示例:

BZPOPMAX 是 ZPOPMAX 的阻塞版本

语法

BZPOPMAX key [key ...] timeout

        timeout 代表阻塞的最长时间,单位为 秒,可以输入多个 key ,表示监控多个有序队列,当某个有序队列有元素就可以获取

时间复杂度:O(log(N))

返回值:元素列表

示例:

        当监控的有序队列都没有元素时,那么该命令就会进入阻塞,直到有序队列中添加了元素或达到了最大阻塞时间,才能结束命令

ZPOPMIN 删除并返回分数最低的 count 个元素

语法

ZPOPMIN key [count]

时间复杂度:O(log(N)*M)

返回值:分数和元素列表

示例:

BZPOPMIN 是 ZPOPMIN 的阻塞版本

语法

BZPOPMIN key [key ...] timeout

         timeout 代表阻塞的最长时间,单位为 秒,可以输入多个 key ,表示监控多个有序队列,当某个有序队列有元素就可以获取

时间复杂度:O(log(N))

返回值:元素列表

示例:

        当监控的有序队列都没有元素时,那么该命令就会进入阻塞,直到有序队列中添加了元素或达到了最大阻塞时间,才能结束命令

ZRANK 返回指定元素的排名(升序)

语法

ZRANK key member

时间复杂度:O(log(N))

返回值:排名

ZREVRANK 返回指定元素的排名(降序)

语法

ZREVRANK key member

时间复杂度:O(log(N))

返回值:排名

ZSCORE 返回指定元素的分数

语法

ZSCORE key member

时间复杂度:O(1) (因为开发者觉得该命令会经常使用,所以进行了优化,牺牲了空间来保证时间)

返回值:分数

ZREM 删除指定的元素

语法

ZREM key member [member ...]

时间复杂度:O(M*log(N))

返回值:本次操作删除的元素个数

ZREMRANGEBYRANK 按照排序删除指定范围的元素(升序)

语法

ZREMRANGEBYRANK key start stop

元素范围左闭右闭 [ start,stop ]

时间复杂度:O(log(N)+M)

返回值:本次操作删除的元素个数

ZREMRANGEBYSCORE 按照分数删除指定范围的元素(升序)

语法

ZREMRANGEBYSCORE key min max

元素范围左闭右闭 [ start,stop ]

时间复杂度:O(log(N)+M)

返回值:本次操作删除的元素个数

ZINCRBY 为指定的元素的关联分数添加指定的分数值

语法

ZINCRBY key increment member

时间复杂度:O(log(N))

返回值:增加后元素的分数

ZINTERSTORE 求出有序集合中元素的交集并保存进目标有序集合中

        求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。

语法

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

        时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了 ⼏个有序集合; M 是最终结果的有序集合的元素个数.

        返回值:⽬标集合中的元素个数

  • numkeys 是整数,描述了后面有多少个集合参与交集运算(之所以要说明集合个数,是为了避免与后面的选项产生歧义,知道个数以后,就能判断哪里是集合,哪里是选项)(类似粘包问题)
  • WEIGHTS 是权重,有序集合带有分数,此处指定的权重,相对于一个系数,会在求交集时,乘以当前的分数
  • AGGREGATE 表示求交集时,元素的分数按什么方式选择 (因为不同的集合中,相同的元素都有自己的分数),SUM 表示求和,MIN 表示取最小值,MAX 表示取最大值

例子

不带选项

        默认不带选项的情况下,分数是相同元素的分数之和

带 WEIGHTS 权重选项

        元素的分数会先乘以权重,再求和

带 AGGREGATE 选项

SUM 选项

        和默认情况一样,元素的分数就是各个集合中对应元素的分数之和

MIN 选项

        元素的分数就是各个集合中对应元素分数的最小值

MAX 选项

        

        元素的分数就是各个集合中对应元素分数的最大值

ZUNIONSTORE 求出有序集合中元素的并集并保存进目标有序集合中

        求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。

语法

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] 
[AGGREGATE <SUM | MIN | MAX>]

        ZUNIONSTORE 和 ZINTERSTORE 的选项含义完全一样,只是一个求并集,一个求交集,推荐看上面的 ZINTERSTORE 作为参考

内部编码

有序集合类型的内部编码有两种:

  • ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个), 同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
  • skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降。

        通过 object encoding 可以查看内部编码

使用场景

        有序集合⽐较典型的使⽤场景就是排⾏榜系统。例如常⻅的⽹站上的热榜信息,榜单的维度可能是多⽅⾯的:按照时间、按照阅读量、按照点赞量。

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

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

相关文章

数据分析师 医学spss数据分析,游程检验(Run Test)是一种非参数性统计假设的检验方法,也称为“连贯检验”,医学统计学

游程检验&#xff08;Run Test&#xff09;是一种非参数性统计假设的检验方法&#xff0c;也称为“连贯检验”。它是基于样本标志表现排列所形成的游程&#xff08;即连续出现相同数值的序列&#xff09;的多少进行判断的检验方法。游程检验主要用于两个独立样本的比较和观测结…

TC3xx MTU概述(1)

目录 1.MTU基本功能 2.MBIST 3.小结 1.MTU基本功能 在TC3xx中&#xff0c;MTU(Memory Unit Test)被用来管理控制芯片内部各种RAM的测试、初始化和数据完整性检查。 既然MTU主要是管理和控制&#xff0c;那干活的想必另有他人。所以在该平台中&#xff0c;我们可以看到SRAM…

C++:哈希表和unordered系列容器的封装

一、unordered系列关联式容器的介绍 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log2N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&…

Python语言在地球科学中地理、气象、气候变化、水文、生态、传感器等数据可视化到常见数据分析方法的使用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台&#xff08;x86和arm&#xff09;&#xff0c;Python简洁的语法和对动态输入的支持&#xff0c;再加上解释性语言的本质&…

深度学习之视觉特征提取器——AlexNet

AlexNet 参考资料&#xff1a; &#xff08;1&#xff09;ImageNet十年历任霸主之AlexNet - 知乎 (zhihu.com) &#xff08;2&#xff09;AlexNet - Wikipedia 引入 AlexNet在2012年以第一名在Top-1分类精度霸榜ImageNet&#xff0c;并超过第二名近10个百分点&#xff0c;…

On Hold 频发!又3本期刊被标记为On Hold ,大家谨慎投递!

【SciencePub学术】On Hold 频发&#xff01;小编在查阅资料的时候发现又有3本期刊被标记为On Hold 了&#xff0c;今天小编给大家详细介绍一下这3本期刊。 来源&#xff1a;科睿唯安官网 Results in Physics 1 期刊概况 【期刊简介】IF&#xff1a;5.3&#xff0c;JCR1区&am…

RockChip Android13 NFC SL6320移植

环境:RK3568 Android13 一:驱动移植 1、驱动 将SL6320驱动代码拷贝至kernel-5.10/drivers/misc/sl6320/ 特殊说明:勿将驱动代码放置于kernel-5.10/drivers/nfc/目录下,会导致sl6320驱动生成设备节点时因/dev/nfc节点以创建而加载失败。 2、DTS 本次硬件设计电路走I2C协…

获取京东商品详情,API返回值说明全攻略

京东商品详情API是开发者获取京东平台上商品详细信息的重要工具。通过调用API并解析返回的响应数据&#xff0c;您可以快速获取商品的各项属性&#xff0c;如商品ID、标题、价格、图片等。下面&#xff0c;我们将为您详细介绍京东商品详情API的返回值说明&#xff0c;帮助您更好…

Spring - 8 ( 10000 字 Spring 入门级教程 )

一&#xff1a; MyBatis 1.1 引入 MyBatis 我们学习 MySQL 数据库时&#xff0c;已经学习了 JDBC 来操作数据库, 但是 JDBC 操作太复杂了. 我们先来回顾⼀下 JDBC 的操作流程: 创建数据库连接池 DataSource通过 DataSource 获取数据库连接 Connection编写要执行带 ? 占位符…

三岁孩童被家养大型犬咬伤 额部撕脱伤达10公分

近期&#xff0c;一名被家养大型犬咬伤了面部的3岁小朋友&#xff0c;在被家人紧急送来西安国际医学中心医院&#xff0c;通过24小时急诊门诊简单救治后&#xff0c;转至整形外科&#xff0c;由主治医师李世龙为他实施了清创及缝合手术。 “患者额部撕脱伤面积约为10公分&…

什么是高级持续威胁(APT)

高级持续性威胁&#xff08;Advanced Persistent Threat&#xff0c;APT&#xff09;&#xff0c;又叫高级长期威胁&#xff0c;是一种复杂的、持续的网络攻击&#xff0c;包含三个要素&#xff1a;高级、长期、威胁。 【高级】是指执行APT攻击需要比传统攻击更高的定制程度和…

【教程】极简Python接入免费语音识别API

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 安装库&#xff1a; pip install SpeechRecognition 使用方法&#xff1a; import speech_recognition as srr sr.Recognizer() harvard sr…

省公派出国|社科类普通高校教师限期内赴英国访学交流

在国外访问学者申请中&#xff0c;人文社科类相对难度更大&#xff0c;尤其是英语语言学&#xff0c;作为非母语研究并不被国外高校看重。经过努力&#xff0c;最终我们帮助Z老师申请到英国坎特伯雷基督教会大学的访学职位&#xff0c;并在限期内出国。 Z老师背景&#xff1a; …

如何在 Windows 11 上检查和显示 CPU 温度

1.为什么需要监控 CPU 温度&#xff1f; CPU 是您计算机的核心&#xff0c;是从后台运行整个节目的木偶大师&#xff0c;接收指令并处理保持整个 shindig 运行所需的处理能力。并且需要定期监测其内部温度&#xff0c;以确保节目不会着火。高于平均水平的热量总是会导致性能急…

jenkins常用插件之Filesystem Trigger

安装插件 Filesystem Trigger 项目配置 验证 根据上述配置&#xff0c;当1.txt文件发生变化时&#xff0c;jenkins每分钟会进行检测&#xff0c;检测到后即进行任务构建&#xff0c;后续的具体操作可自行配置

css响应式布局左、右上、右中布局

一、布局效果 二、布局代码 <div class"parent"><div class"left">菜单</div><div class"right"><div class"right-top">顶部导航</div><div class"right-content"></div>…

SpringBoot集成阿里云短信验证码服务

一&#xff1a;前言 最近在项目开发过程中&#xff0c;需要去写一个发送手机短信验证码的功能。在网上查了一下&#xff0c;有很多服务器可供选择&#xff0c;本文的话是基于阿里云服务的短信验证码功能实现。 关于注册和开通服务这些需要操作的&#xff0c;请各位小伙伴参考官…

Vue、React实现excel导出功能(三种实现方式保姆级讲解)

第一种&#xff1a;后端返回文件流&#xff0c;前端转换并导出&#xff08;常用&#xff0c;通常公司都是用这种方式&#xff09; 第二种&#xff1a;纯后端导出&#xff08;需要了解&#xff09; 第三种&#xff1a;纯前端导出&#xff08;不建议使用&#xff0c;数据处理放…

使用Ruoyi的定时任务组件结合XxlCrawler进行数据增量同步实战-以中国地震台网为例

目录 前言 一、数据增量更新机制 1、全量更新机制 2、增量更新机制 二、功能时序图设计 1、原始请求分析 2、业务时序图 三、后台定时任务的设计与实现 四、Ruoyi自动任务配置 1、Ruoyi自动任务配置 2、任务调度 总结 前言 在之前的相关文章中&#xff0c;发表文章列…

clang:在 Win10 上编译 MIDI 音乐程序(一)

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 访问 Swift.org - Download Swift 找到 Windows 10&#xff1a;x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ &#xff0c;安装后大约占…