Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

Sorted Set 类型

文章目录

  • Sorted Set 类型
  • zadd 命令
  • zrange 命令
  • zcard 命令
  • zcount 命令
  • zrevrange 命令
  • zrangebyscore 命令
  • zpopmax 命令
  • bzpopmax 命令
  • zpopmin 命令
  • bzpopmin 命令
  • zrank 命令
  • zscore 命令
  • zrem 命令
  • zremrangebyrank 命令
  • zremrangebyscore 命令
  • zincrby 命令
  • zinterstore 命令
  • zunionstore 命令

前面文章讲解了 Set 类型,Set 类型有一个特点,就是集合中的元素是唯一的。而 Zset 类型(Sorted Set)不同,它是一个有序集合,集合中的每一个元素是由“两个单元组成的”,分别是: 元素本身+对应的分数,依靠这个分数,就维护了集合中元素的有序性,什么意思呢,举个例子:

在三国中,每一个武将都是有武力值的,我们根据武力值就可以对武将进行一个排名,如下图:

在这里插入图片描述

在 zset 类型中,默认是按照**“升序”**的方式排列的,提供了一组获取元素分数、元素范围查询等等功能命令,下面就来介绍一些主要并且常用的命令。

zadd 命令

使用 zadd 命令往有序集合中添加元素和分数,在不指定选项的情况下,如果元素已经存在,则更新分数,如果元素不存在,则添加元素及分数

语法:zadd key [NX | XX] [GT | LT] [CH] [INCR] score member [score member…….]

NX:只能添加新元素,如果元素已经存在,则不能修改已经存在的元素

XX:只能更新已经存在元素,如果元素不存在,不能添加新元素

CH:默认情况下,zadd 返回的是本次成功添加的元素个数,但指定这个选项之后,如果只是更新了分数,那么还会把更新分数的元素给计算上

LT:当前指定的元素必须存在,并且新的分数比当前元素的分数小,才会更新

GT:当前指定的元素必须存在,并且新的分数比当前元素的分数大,才会更新

INCR:将元素的分数加上指定的分数,此时只能指定一个元素和一个分数

score member:表示要添加的元素及分数,并且可以指定多个

操作演示:

  1. 不指定任何选项

zadd key score member

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

时间复杂度:log(N),会先查找,再加入

在这里插入图片描述

  1. 指定 nx 选项

zadd key nx score member

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

时间复杂度:log(N),会先查找,再加入

使用 nx 选项添加“赵云”,因为“赵云”存在,所以并没有对 “赵云” 这个元素进行修改

在这里插入图片描述

因为 “关羽” 不存在,所以,就可以成功添加 “关羽”

在这里插入图片描述

  1. 指定 xx 选项

zadd key xx score member

返回值:0,就算修改分数成功,也会返回 0

时间复杂度:log(N),会先查找,在加入

使用 xx 选项,添加 “曹操”,因为曹操这个元素已经存在,所以,就只会更新“分数”

在这里插入图片描述

因为 “刘备” 不存在,所以,在使用 xx 选项进行添加时,也不会成功添加

在这里插入图片描述

  1. 指定 ch 选项

zadd key ch score member

返回值:成功添加以及更新的元素个数

时间复杂度:log(N)

修改 “曹操” 的分数为77,修改成功后,返回了一个0,但是,这个返回值就不太好,我们就无法知道我们是否已经修改成功

在这里插入图片描述

如果加上 ch 选项,那么,就也会将成功修改的元素数量返回,如下图:

修改曹操的分数为 95

在这里插入图片描述

  1. 指定 incr 选项

zadd key incr score member

返回值:修改之后的分数

给 “曹操” 加上 5 分

在这里插入图片描述

zrange 命令

查看有序集合中的元素

语法:zrange key start end [withscores]

【start end】 表示左右区间,获取指定区间内的元素,cong 0 开始,并且支持负数

withscores 选项表示将元素的分数也显示出来

时间复杂度:O(log(N) + M),此处 log(N) 要找start对应的位置,接下来就开始遍历,M 表示遍历的元素个数。

操作演示:

在这里插入图片描述

注意:在redis 中,对于字符,存储的是二进制数据,在获取的时候,获取的也是二进制数据,并不会进行“字符集编码”,所以,在使用 redis-cli 使用 Redis 客户端时,需要再加一个 – raw 选项才可以显示出来字符。

zcard 命令

获取有序列表中元素的个数

语法:zcard key

返回值:元素个数

时间复杂度:O(1)

操作演示:

在这里插入图片描述

zcount 命令

获取指定区间中元素的个数

语法:zcount key min max

min 表示左区间

max 表示右区间

并且是闭区间,是包含边界值的,如果不想包含边界值,可以使用 (min (max,这里的 min、max 表示下标,获取指定下标内的元素个数

返回值:元素的个数

时间复杂度:log(N)

注意:zcount 在计算元素个数的时候,是先根据分数找到元素,在根据元素获取到排名,两个排名再相减,就得到了元素的个数。

操作演示:

在这里插入图片描述

使用开区间,不包含 98

在这里插入图片描述

使用开区间,不包含98,也不包含100

在这里插入图片描述

注意:min 和 max 是可以写成浮点数的(zset 分数本身就是浮点数)

在浮点数中,存在两个特殊的数值:inf(无穷大)、-inf(负无穷大),下面演示以下:

也就是获取到所有的元素个数

在这里插入图片描述

zrevrange 命令

按照分数降序遍历打印

语法:zrevrange key start end [withscores]

返回值:所有元素降序排列

时间复杂度:O(N)

操作演示:

在这里插入图片描述

zrangebyscore 命令

按照分数查询元素,和上面的 zcount 类似,只不过,zcount是在下标区间内查询,而 zrangebyscore 是在指定的分数范围内查询,并获取到区间内的元素

语法:zrangebyscore key min max [withscores]

返回值:区间内的元素

时间复杂度:O(logN+M)

操作演示:

在这里插入图片描述

zpopmax 命令

删除有序集合中分数最高的 count 个元素

语法:zpopmax key [count]

返回值:返回删除的元素

时间复杂度:O(log(N)*M),M 表示删除元素的个数

操作演示:

在这里插入图片描述

注意:如果存在多个元素,分数相同,并且同时为最大值,zpopmax删除的时候,仍然删除其中一个,因为,在有序列表中,分数相同的元素在排序时会按照字典序来排,删除靠前的元素

bzpopmax 命令

zpopmax 的阻塞版本,如果有序集合为空,则进行阻塞,阻塞超过一定时间后,就停止阻塞等待,这里就可以把这个有序集合看成一个带有“阻塞功能”的优先级队列

语法:bzpopmax key [key……] timeout

这里的 timeout 单位是:秒

返回值:指定键中最大的元素

时间复杂度:O(logN)

操作演示:

当指定的 “键” 不存在时,就进行阻塞,下图中,设置的阻塞等待时间是 600 秒
在这里插入图片描述

在另一个Redis 客户端添加 key1 这个键,此时,正在阻塞的客户端会直接获取到里面的元素,返回的值包含三部分:“键” 、元素、分数

在这里插入图片描述

zpopmin 命令

删除有序集合中最小的元素

语法:zpopmin key [count]

时间复杂度:O(logN*M)

返回值:返回删除的元素

操作演示:

在这里插入图片描述

bzpopmin 命令

zpopmin 的阻塞版本,如果有序集合为空,则进行阻塞,阻塞超过一定时间后,就停止阻塞等待,这里就可以把这个有序集合看成一个带有“阻塞功能”的优先级队列

语法:bzpopmin key [key] timeout

可以同时监听多个 key ,哪个 key 不为空,就返回哪个 key 中最小的元素

返回值:删除成功的最小的元素

时间复杂度:O(logN)

这里和 bzpopmax 的用法一样,就不在演示。

zrank 命令

查看元素在有序集合中的位置(按照升序的方式查看)

语法:zrank key member

返回值:指定元素的位置

时间复杂度:O(logN)

操作演示:

在这里插入图片描述

zrevrank key member

这个是按照倒序的方式查看的

在这里插入图片描述

zscore 命令

查询指定元素的分数

语法:zscore key member

时间复杂度:O(1)

返回值:指定元素的分数

操作演示:

在这里插入图片描述

zrem 命令

删除指定的元素

语法:zrem key member [member]、

时间复杂度:O(logN *M)

返回值:表示删除成功的元素个数

操作演示:

在这里插入图片描述

zremrangebyrank 命令

删除指定范围内的元素

语法:zremrangebyrank key start end

时间复杂度:O(longN + M)

N 是有序集合的元素个数

M 是start - end 区间内的元素

[start,end] 这是闭区间

返回值:成功删除元素的个数

操作演示:

在这里插入图片描述

zremrangebyscore 命令

通过大小分数来指定一个删除的区间

语法:zremrangebyscore key min max

这里的 [min,max] 默认是闭区间,当然也可以通过 “(” 自定开区间

时间复杂度:O(logN+M)

返回值:成功删除元素的个数

操作演示:

删除[50,70] 之间的分数

在这里插入图片描述

zincrby 命令

给指定元素的分数加上指定的分数值

语法:zincrby key increment member

increment 表示要添加的指定分数值,也可以指定负数,这样就变成减法了

时间复杂度:O(logN)

返回值:加上分数后的值

操作演示:

给 v6 的分数加上10

在这里插入图片描述

zinterstore 命令

求指定的有序列表的交集、

语法:zinterstore destination numkeys key[key….] [weigths weight……] [aggregate < sum | min | max]

destination:表示存储交集结果的key

numskeys:表示key的数量

wieghts:给元素分配不同的权重,也就是让元素的分数*指定的权重

agrregate 表示求交集时,交集的结果中元素的分数应该按照哪种规定描述

返回值:交集结果

操作演示:

给 key1 中添加 v1-10、v2-20、v3-30、v4-40

给 key2 中添加 v3-10、v4-20、v5-30、v6-40

在这里插入图片描述

求得交集的结果为

在这里插入图片描述

注意:这里交集结果中元素的分数默认是是交集中相同元素分数的和,但是也可以通过选项指定分数的规则

zunionstore 命令

求指定的有序列表的并集

语法:zunionstore destination numkeys key[key….] [weigths weight……] [aggregate < sum | min | max]

返回值:并集的结果

操作演示
在这里插入图片描述

以上是 zset 类型中主要并且常用命令的一个简单讲解,如果想要学习其他的命令可以参考官方文档:zset命令官方文档跳转链接

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

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

相关文章

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

android Dialog全屏沉浸式状态栏实现

在Android中&#xff0c;创建沉浸式状态栏通常意味着让状态栏背景与应用的主题颜色一致&#xff0c;并且让对话框在状态栏下面显示&#xff0c;而不是浮动。为了实现这一点&#xff0c;你可以使用以下代码片段&#xff1a; 1、实际效果图&#xff1a; 2、代码实现&#xff1a;…

揭秘GPT-4o:未来智能的曙光

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;的发展突飞猛进&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域的进步&#xff0c;更是引人注目。在这一背景下&#xff0c;OpenAI发布的GPT系列模型成为了焦点。本文将详细探讨最新的模型GPT-4o&a…

Unity海面效果——6、反射和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿赵。 上一篇的结束时&#xff0c;海面效果已经做成这样了&#xff1a; 这个Shader的复杂程度已经比较高了&#xff1a; 不过还有一些美中不足的地方。 1、 海平面没有反射到天空球 2、 在近岸边看得到水底的部分&#xff0c;水…

一些关于C++的基础知识

引言&#xff1a;C兼容C的大部分内容&#xff0c;但其中仍有许多小细节的东西需要大家注意 一.C的第一个程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看这个是否感觉一头雾水…

数据挖掘——matplotlib

matplotlib概述 Mat指的是Matlab&#xff0c;plot指的是画图&#xff0c;lib即library&#xff0c;顾名思义&#xff0c;matplotlib是python专门用于开发2D图表的第三方库&#xff0c;使用之前需要下载该库&#xff0c;使用pip命令即可下载。 pip install matplotlib1、matpl…

elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

服务注册Eureka

目录 一、背景 1、概念 2、CAP 理论 3、常见的注册中心 二、Eureka 三、搭建 Eureka Server 1、搭建注册中心 四、服务注册 五、服务发现 六、Eureka 和 Zooper 的区别 一、背景 1、概念 远程调用就类似于一种通信 例如&#xff1a;当游客与景区之间进行通信&…

Xubuntu24.04之设置高性能模式两种方式(二百六十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

苍穹外卖--新增员工

代码开发 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.entity.Employee; import com.sky.properties.JwtProperties; import com.sky.result.Result…

Springboot各个版本维护时间

Springboot各个版本维护时间

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备…

jmeter持续学习之----性能初级一些概念和指标

服务端为什么要进行性能测试 大量用户下&#xff0c;系统能否稳定运行&#xff08;比较多&#xff09; 用于硬件服务器的选型 用于软件技术的选型 性能测试关注的点 用户角度:响应时间 资源占用:并发用户数,TPS,资源占用(cpu,内存,JVM) 性能测试策略 基准测试:单用户测试,对…

去了字节跳动,才知道年薪40W的测试有这么多?

最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的测试都这么有钱了吗&#xff1f; 前几天还有朋友说&#xff0c;从腾讯跳槽去了字节&…

8.8.8.8 IP地址的作用

在跟着韦东山老师的学习手册中看见了关于8.8.8.8 IP用于检测网络状态&#xff0c;然后搜索了关于此IP的相关作用如下&#xff1a; 公共DNS服务&#xff1a;8.8.8.8是Google提供的两个公共DNS服务器地址之一&#xff08;另一个是8.8.4.4&#xff09;。DNS&#xff08;域名系统&a…

强化基石,引领未来:完善配套设施与提升服务水平

完善配套设施与提升服务水平对于产业园运营具有重要意义。它们不仅能够提升园区的硬件环境和整体形象&#xff0c;增强园区的吸引力和竞争力&#xff1b;还能够优化营商环境&#xff0c;降低企业运营成本&#xff0c;提高运营效率&#xff1b;同时推动园区创新&#xff0c;形成…

基于Java技术的网吧管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构 工具&#xff1a;MyEclipse&#xff0c;MySQL 系统展示 首页 个人中…

【技术追踪】DiffuMatting:使用抠图级别注释合成任意对象(ECCV-2024)

万物生&#xff1a;Diffusion与绿幕抠图&#xff0c;影视领域的福音~ 论文&#xff1a;DiffuMatting: Synthesizing Arbitrary Objects with Matting-level Annotation 代码&#xff1a;https://github.com/HUuxiaobin/DiffuMatting &#xff08;即将开源&#xff09; 0、摘要 …

(补充):java各种进制和文本、图像、音频在计算机中的存储方式

文章目录 前言一、进制1 逢几进一2 常见进制在java中的表示3 进制中的转换(1)任意进制转十进制(2)十进制转其他进制二、计算机中的存储1 计算机的存储规则(文本数据)(1)ASCII码表(2)编码规则的发展演化2 计算机的存储规则(图片数据)(1)分辨率、像素(2)黑白图与灰度…

Knife4j的介绍与使用

目录 一、简单介绍1.1 简介1.2 主要特点和功能&#xff1a; 二、使用步骤&#xff1a;2.1 添加依赖&#xff1a;2.2 yml数据源配置2.3 创建knife4j配置类2.4 注解的作用 最后 一、简单介绍 1.1 简介 Knife4j 是一款基于Swagger的开源文档管理工具&#xff0c;主要用于生成和管…