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

news2024/9/19 18:30:46

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.coloradmin.cn/o/1911968.html

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

相关文章

vue子组件调用父组件方法

父组件 页面<popoverss ref"pop" :goodspop"goodspop"></popoverss>子组件components: {"popoverss": () > import(../comm/popover.vue)},方法goodspop(e){console.log(e"----")return 9999;},子组件 方法props:[go…

【转载】目标检测mAP的含义

转载自三叔家的猫 https://blog.csdn.net/qq_39056987 https://blog.csdn.net/qq_39056987/article/details/104348493 <div id"content_views" class"markdown_views prism-atom-one-light"><svg xmlns"http://www.w3.org/2000/svg" s…

不用服务器 | 我搭建了一个属于自己的GPT聊天应用!!!

原文地址&#xff1a;aiutools.fun/archives/5118 平台限制部分内容未显示&#xff0c;详情请访问原文。 展示 不废话&#xff0c;直接上干货&#xff01; 我这里搭建的Lobe Chat 支持 聊天TTS & STT 语音会话文生图各种优秀的插件 下面搭建好的样子 前期准备 需要…

(2)滑动窗口算法练习:无重复字符的最长子串

无重复字符的最长子串 题目链接&#xff1a;3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"a…

Java字符串(String、字符串拼接、原理)

文章目录 一、String字符串1.1创建方式【直接赋值、new一个对象】1.1.1 使用字符串字面值直接赋值&#xff1a;&#xff08;1&#xff09;字符串字面量创建String对象的转换过程&#xff08;2&#xff09;一些方法&#xff08;3&#xff09;说明 1.1.2 使用new关键字创建字符串…

Java如何自定义注解及在SpringBoot中的应用

注解 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说…

最快视频转绘-AnimateDiff-Lightning

最快视频转绘-AnimateDiff-Lightning Video-to-Video Generation AnimateDiff-Lightning 非常适合视频到视频的生成。使用 ControlNet 提供最简单的 comfyui 工作流程。 「ComfyUI-aki-v1.3.7z」链接&#xff1a;https://pan.quark.cn/s/199a753292d8 下载导入工作流 animat…

182440-00SF 同轴连接器

型号简介 182440-00SF是Southwest Microwave的一款连接器。该连接器采用 BeCu UNqS C17300 材料&#xff0c;并进行了镀金处理&#xff0c;以确保良好的导电性和耐腐蚀性&#xff1b;螺纹采用符合 ASTM A2582 标准的钢制合金&#xff0c;并进行磷酸盐钝化处理&#xff0c;以提高…

FunAudioLLM SenseVoice语音转录与CosyVoice语音合成及语音克隆使用案例

参考: https://fun-audio-llm.github.io/ 1、SenseVoice语音转录 在线体验:https://modelscope.cn/studios/iic/CosyVoice-300M 参考:https://github.com/FunAudioLLM/SenseVoice 下载: pip install -U funasr使用: from funasr import AutoModelmodel_dir = "…

如何从 Vue 2 无痛升级到 Vue 3,一文搞定!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 随着 Vue 3 的发布,许多开发者都面临着从 Vue 2 升级到 Vue 3 的挑战。 本文将详细介绍如何从 Vue 2 无痛升级到 Vue 3,包括每个步骤的详细说明与代码示例。 让我们开始吧! 准备工作 在正式开始升级之前,请确保你已经…

Linux网络命令:网络工具socat详解

目录 一、概述 二、基本用法 1、基本语法 2、常用选项 3、获取帮助 三、用法示例 1. 监听 TCP 端口并回显接收到的数据 2. 通过 TCP 端口转发数据到 UNIX 套接字 3. 将文件内容发送到 TCP 端口&#xff1a; 4. 使用伪终端进行串行通信 5、启动一个TCP服务器 6、建…

【Linux】网络新兵连

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 在上一篇博客中&#xff0c;我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容&#xff0c;那么我们开始吧&#xff01; 1.网络中的地址管理 大家一…

【Linux】多线程_2

文章目录 九、多线程2. 线程的控制 未完待续 九、多线程 2. 线程的控制 主线程退出 等同于 进程退出 等同于 所有线程都退出。为了避免主线程退出&#xff0c;但是新线程并没有执行完自己的任务的问题&#xff0c;主线程同样要跟进程一样等待新线程返回。 pthread_join 函数…

搜维尔科技:OptiTrack在NAB2024展示了一系列业界领先的媒体技术

广泛的显示和动作捕捉跟踪技术组合涵盖无与伦比的室内和室外 LED 解决方案、前沿技术演示以及最新的软件和硬件产品 可视化技术领域的全球领导者 Planar及其附属公司 3D 跟踪系统的全球领导者OptiTrack宣布&#xff0c;两家公司将在 2024 年全国广播协会 (NAB) 展会上展示其最全…

【动态规划Ⅴ】二维数组的动态规划——0/1矩阵、最大正方形

二维数组的动态规划——0/1矩阵、最大正方形 最大正方形1277. 统计全为 1 的正方形子矩阵221. 最大正方形 01矩阵542. 01 矩阵 最大正方形 下面两个题目是非常相似的&#xff0c;只是一个统计正方形数目&#xff0c;一个统计最大正方形的面积。 1277. 统计全为 1 的正方形子矩…

【优先级队列PriorityQueue】

目录 1&#xff0c;优先级队列 1.1 概念 2&#xff0c;优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 堆的向下调整&#xff08;大根堆&#xff09; 2.3.2 建堆的时间复杂度​编辑 2.4 堆的插入与删除 2.4.1 堆的插入 2.4.2 堆的删除 3&a…

源码编译构建LAMP(企业网站架构部署与优化)

部署LAMP平台 LAMV架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包 括 Linux操作系统&#xff0c;Apache网站服务器、MySQL数据库服务器、P…

ElementPlusError: [ElPagination] 你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档 - 报警告之一

一、问题描述&#xff1a; 今天在使用elementui plus的时候遇到了一个奇葩的问题&#xff0c; 就是提示 使用了一些已被废弃的用法&#xff0c; 奇葩就在于我是 复制另一个页面的分页&#xff0c; 一摸一样的东西&#xff0c;就只这个页面报错&#xff0c; 分页也不出 为了这个…

App Cleaner Uninstaller 8.3.0激活版 最佳卸载程序和清理助手

App Cleaner & Uninstaller 完全安全地删除 Mac 上的程序&#xff0c;删除应用程序的残留物&#xff0c;管理扩展程序和启动程序。 App Cleaner & Uninstaller 8.3.0激活版下载 卸载应用程序和所有不需要的垃圾文件 当您将应用程序拖放到废纸篓时&#xff0c;请检查您…

鸿蒙开发学习笔记1

一、下载 deveco-studio 编译器 https://developer.huawei.com/consumer/cn/deveco-studio/#download 二、ArkTs 0、基本数据类型&#xff1a; 3种&#xff1a;string、number、boolean 1、存储数据&#xff08;变量、常量&#xff09; 注&#xff1a;类似于 ts 使用 con…