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

news2024/11/13 9:08:47

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/1923097.html

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

相关文章

秋招Java后端开发冲刺——Mybatis使用总结

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目&#xff0c;它封装了 JDBC&#xff0c;使开发者只需要关注 SQL 语句本身&#xff0c;而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO&#xff08;Plain …

服务器数据恢复—2块硬盘离线且热备盘未完全激活的raid5数据恢复案例

服务器存储数据恢复环境&#xff1a; 北京某企业一台EMC FCAX-4存储上搭建一组由12块成员盘的raid5磁盘阵列&#xff0c;其中包括2块热备盘。 服务器存储故障&#xff1a; raid5阵列中两块硬盘离线&#xff0c;热备盘只有一块成功激活&#xff0c;raid瘫痪&#xff0c;上层LUN…

Sentinel限流算法:滑动时间窗算法、漏桶算法、令牌桶算法。拦截器定义资源实现原理

文章目录 滑动时间窗算法基本知识源码算法分析 漏桶算法令牌桶算法拦截器处理web请求 滑动时间窗算法 基本知识 限流算法最简单的实现就是使用一个计数器法。比如对于A接口来说&#xff0c;我要求一分钟之内访问量不能超过100&#xff0c;那么我们就可以这样来实现&#xff1…

学习C++,应该循序渐进的看哪些书?

学习C是一个循序渐进的过程&#xff0c;需要根据自己的基础和目标来选择合适的书籍。以下是一个推荐的学习路径&#xff0c;包含了从入门到进阶的书籍&#xff1a; 1. 入门阶段 《C Primer Plus 第6版 中文版》 推荐理由&#xff1a;这本书同样适合C零基础的学习者&#xff0…

几何建模-Parasolid中GO功能使用

1.背景介绍 1.1 Parasolid和它的接口间关系 1.2 什么是GO GO全称是Graphical Output.你的程序需要在屏幕或者打印设备上显示模型数据时。在需要使用PK中的某个渲染函数时创建图形显示数据时&#xff0c;Parasolid会调用GO相关的函数。GO函数会输出绘图指令给你的应用程序提供…

映美精黑白相机IFrameQueueBuffer转halcon的HObject

映美精黑白相机&#xff0c;用wpfhalcon开发取图 1.到官网下载&#xff0c;开发包 1sdk 2c开发例子 3c#开发例子 引入TIS.Imaging.ICImagingControl35.dll 3.ICImagingControl使用这个类控制相机 /// <summary> /// 相机控制 /// </summary> public ICImagingC…

《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》

MindNLP 原理 MindNLP 是一个自然语言处理&#xff08;NLP&#xff09;框架&#xff0c;用于处理和分析文本数据。 文本预处理&#xff1a;包括去除噪声、分词、词性标注、命名实体识别等步骤&#xff0c;使文本数据格式化并准备好进行进一步分析。 特征提取&#xff1a;将文…

LightRAG:高效构建和优化大型语言模型应用的 PyTorch 框架

一、前言 随着大语言模型 (LLM) 的蓬勃发展&#xff0c;检索增强生成 (RAG) 技术作为一种将 LLM 与外部知识库结合的有效途径&#xff0c;受到了越来越多的关注。 然而&#xff0c;构建 LLM 应用的真正挑战在于开发者需要根据具体需求进行高度定制化&#xff0c;而现有的 RAG …

《向量数据库指南》2024年中国向量数据库名录大全

2024年中国向量数据库名录大全 序号 百科ID 数据库名称 slogan 厂商 来源 开源 类型 1 1228 TensorDB 爱可生向量数据库 上海爱可生信息技术股份有限公司 自研 商业 向量 2 972 Milvus 开源向量数据库 上海赜睿信息科技…

centos安装minio文件系统服务器(踩坑版)

centos安装minio文件系统服务器&#xff08;踩坑版&#xff09; 引安装1. 下载2. 启动3. 创建access keys4. 创建buckets 坑 引 本来安装挺简单的&#xff0c;网上的教程一大堆&#xff0c;有些写的也挺详细的。不过自己还是踩到坑了&#xff0c;耽误了个把小时&#xff0c;特…

【源码+文档+调试讲解】全国消费水平展示平台

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于全国消费水平展示平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了全国消费水平展示平台&#xff0c;它彻底…

如何找回误删的文件?4个常用文件恢复方法!

对于许多用户来说&#xff0c;误删文件是一种常见而令人懊恼的情况。恢复误删文件的重要性在于&#xff0c;它可以帮助用户找回宝贵的数据&#xff0c;避免因数据丢失带来的各种不便和损失。 如何找回不小心删除的文件&#xff1f; 误删数据不知道怎么恢复&#xff0c;会给我…

对进阶指针的追忆

目录 思维导图 指针前言 一&#xff1a;字符指针 二&#xff1a;指针数组 三&#xff1a;数组指针 四&#xff1a;数组参数 && 指针参数 五&#xff1a;函数指针 六&#xff1a;函数指针数组 七&#xff1a;函数指针数组的指针 八&#xff1a;回调函数 思维导…

MySql 数据库 (基础) - 下载安装

MySQL数据库 简单介绍 数据库 数据存储的仓库数据库管理系统 操作和管理数据库的大型软件SQL 操作关系型数据库的变成语言&#xff0c;是一套标准 版本 MySQL官方提供了两种不同的版本&#xff1a; 社区版 免费&#xff0c;MySQL不提供任何的技术支持商业版 收费&#xff0c…

暑期备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…

谷粒商城实战笔记-29~34-前端基础 - ES6

文章目录 零&#xff0c;安装Live Server插件一&#xff0c;创建前端工程1&#xff0c;创建工程2&#xff0c;在工程ES6中创建一个html文件 二&#xff0c;ES6 简介1&#xff0c;ES6 的历史 三&#xff0c;前端基础ES61&#xff0c;let 和 const1.1&#xff0c;let1.1.1 严格的…

JavaScript青少年简明教程:开发工具与运行环境

JavaScript青少年简明教程&#xff1a;开发工具与运行环境 JavaScript是一种基于对象和事件驱动且具有安全性能的脚本语言。使用它和HTML结合可以开发出交互式的Web页面。 脚本语言是为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言。脚本通常是解释执行而非编…

text prompt如何超过77个词

【深度学习】sdwebui的token_counter,update_token_counter,如何超出77个token的限制?对提示词加权的底层实现_prompt中token权重-CSDN博客文章浏览阅读1.6k次,点赞26次,收藏36次。文章探讨了如何在StableDiffusionProcessing中处理超过77个token的提示,涉及token_counte…

Is Temperature the Creativity Parameter of Large Language Models?阅读笔记

最近有小伙伴来问LLM的参数该如何设计&#xff0c;废话不多说来看看paper吧。首先&#xff0c;常见的可以进行调参的几个值有temperature&#xff0c;top-p和top-k。今天这篇文章是关于temperature的。 原文链接&#xff1a;https://arxiv.org/abs/2405.00492 temperature如果…

基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…