Redis - Zset 有序集合

目录

前言

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

命令

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

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

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

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

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

BZPOPMAX 是 ZPOPMAX 的阻塞版本

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

BZPOPMIN 是 ZPOPMIN 的阻塞版本

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

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

ZSCORE 返回指定元素的分数

ZREM 删除指定的元素

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

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

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

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

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

内部编码

使用场景


前言

        它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(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 可以查看内部编码

使用场景

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全网首发】Typecho文章采集器火车头插件去授权版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 目前市面上基本没有typecho火车头采集器 而分享的这一款采集器&#xff0c;牛的一批 内置使用方法与教程&#xff01; 二、效果展示 1.部分代码 代码如下&#xff08;示例&#…

【深度学习实战(33)】训练之model.train()和model.eval()

一、model.train()&#xff0c;model.eval()作用&#xff1f; model.train() 和 model.eval() 是 PyTorch 中的两个方法&#xff0c;用于设置模型的训练模式和评估模式。 model.train() 方法将模型设置为训练模式。在训练模式下&#xff0c;模型会启用 dropout 和 batch norm…

使用双指针解决问题题集(二)

1. 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 示例 2: 输入: nums [4,2,3,4] 输出: 4 题解&a…

set_input_delay的理解

1&#xff0c;set_input_delay约束理解 input_delay是指输入的数据到达FPGA的pad引脚时相对于时钟边沿的延迟有多大&#xff0c;单位是ns&#xff0c;数值可以是正&#xff0c;也可以是负。通过set_input_delay约束告诉编译器输入时钟和输入数据的相位关系。如下图所示假设时钟…

C语言猜数字游戏

用C语言实现猜数字游戏&#xff0c;电脑随机给出一个范围内的数字&#xff0c;用户在终端输入数字&#xff0c;去猜大小&#xff1b;对比数字&#xff0c;电脑给出提示偏大还是偏小&#xff1b;不断循环&#xff0c;直到正确 #include <stdio.h> #include <time.h>…

C++ Primer 总结索引 | 第十四章:重载运算与类型转换

1、C语言定义了 大量运算符 以及 内置类型的自动转换规则 当运算符 被用于 类类型的对象时&#xff0c;C语言允许我们 为其指定新的含义&#xff1b;也能自定义类类型之间的转换规则 例&#xff1a;可以通过下述形式输出两个Sales item的和&#xff1a; cout << item1 …

快速找出存(不存在)在某个(或多个)文件的文件夹

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 想要找出有下面这个文件存在的文件夹 切换到批量文件复制版块&#xff0c;快捷键Ctrl5 右侧&#xff0c;搜索添加 选定范围&#xff0c;勾选搜索文件夹、包…

重生奇迹mu套装大全

1.战士 汉斯的皮套装&#xff1a;冰之指环,皮护腿,皮盔,皮护手,皮靴,皮铠,流星槌 汉斯的青铜套装&#xff1a;青铜护腿,青铜靴,青铜铠 汉斯的翡翠套装&#xff1a;雷之项链,翡翠护腿,翡翠盔,翡翠铠,远古之盾 汉斯的黄金套装&#xff1a;火之项链,黄金护腿,黄金护手,黄金靴,…

Skywalking数据持久化与自定义链路追踪

学习本篇文章之前首先要了解一下Sky walking的基础知识 分布式链路追踪工具Skywalking详解 一&#xff0c;Sky walking数据持久化 Sky walking提供了es&#xff0c;MySQL等数据持久化方案&#xff0c;默认使用h2基于内存的数据库&#xff0c;重启之后数据即会丢失。 在实际工…

renren-fast开源快速开发代码生成器

简介 renrenfast框架介绍 renren-fast是一个轻量级的Spring Boot快速开发平台&#xff0c;能快速开发项目并交付.完善的XSS防范及脚本过滤&#xff0c;彻底杜绝XSS攻击实现前后端分离&#xff0c;通过token进行数据交互 使用流程 项目地址 https://gitee.com/renrenio/ren…

k8s部署skywalking(helm)

官方文档 官方文档说明&#xff1a;Backend setup | Apache SkyWalking官方helm源码&#xff1a;apache/skywalking-helm官方下载&#xff08;包括agent、apm&#xff09;:Downloads | Apache SkyWalking 部署 根据官方helm提示&#xff0c;选择你自己部署的方式&#xff0c…

【LAMMPS学习】八、基础知识(5.8)LAMMPS 中热化 Drude 振荡器教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

SpringBoot中HandlerInterceptor拦截器的构建详细教程

作用范围&#xff1a;拦截器主要作用于Spring MVC的DispatcherServlet处理流程中&#xff0c;针对进入Controller层的请求进行拦截处理。它基于Java的反射机制&#xff0c;通过AOP&#xff08;面向切面编程&#xff09;的思想实现&#xff0c;因此它能够访问Spring容器中的Bean…

如何解决3D模型变黑或贴图不显示的问题---模大狮模型网

在进行3D建模和视觉渲染时&#xff0c;经常会遇到模型表面变黑或贴图不显示的问题&#xff0c;这可能严重影响最终视觉效果的质量。这些问题通常与材质设置、光照配置或文件路径错误有关。本文将探讨几种常见原因及其解决方法&#xff0c;帮助3D艺术家和开发者更有效地处理这些…

TinyXML-2介绍

1.简介 TinyXML-2 是一个简单、小巧的 C XML 解析库&#xff0c;它是 TinyXML 的一个改进版本&#xff0c;专注于易用性和性能。TinyXML-2 用于读取、修改和创建 XML 文档。它不依赖于外部库&#xff0c;并且可以很容易地集成到项目中。 tinyXML-2 的主要特点包括&#xff1a…

回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法

回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法 目录 回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【模型简介】CNN-SE_Attention结合了卷积神经网络&#xff…

武汉星起航:精准布局,卓越服务——运营交付团队领跑亚马逊

在全球电商浪潮中&#xff0c;亚马逊平台以其独特的商业模式和全球化的市场布局&#xff0c;吸引了无数商家和创业者的目光。在这个充满机遇的市场中&#xff0c;武汉星起航电子商务有限公司凭借其专业的运营交付团队&#xff0c;以其独特的五对一服务体系和精准的战略布局&…

Azure AKS日志查询KQL表达式

背景需求 Azure&#xff08;Global&#xff09; AKS集群中&#xff0c;需要查询部署服务的历史日志&#xff0c;例如&#xff1a;我部署了服务A&#xff0c;但服务A的上一个版本Pod已经被杀掉由于版本的更新迭代&#xff0c;而我在命令行中只能看到当前版本的pod日志&#xff…

Git推送本地项目到gitee远程仓库

Git 是一个功能强大的分布式版本控制系统&#xff0c;它允许多人协作开发项目&#xff0c;同时有效管理代码的历史版本。开发者可以克隆一个公共仓库到本地&#xff0c;进行更改后将更新推送回服务器&#xff0c;或从服务器拉取他人更改&#xff0c;实现代码的同步和版本控制。…

普洱茶泡多少茶叶才算淡茶?

普洱茶淡茶一般放几克茶叶&#xff0c;品深茶官网根据多年专业研究与实践结果&#xff0c;制定了淡茶冲泡标准。在冲泡普洱茶淡茶时&#xff0c;茶叶的投放量是关键因素之一。淡茶冲泡标准旨在保持茶汤的清爽口感&#xff0c;同时充分展现普洱茶的独特风味。 根据《品深淡茶冲…