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命令官方文档跳转链接

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

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

相关文章

干货:高水平论文写作思路与方法

前言:Hello大家好,我是小哥谈。高水平论文的写作需要扎实的研究基础和严谨的思维方式。同时,良好的写作技巧和时间管理也是成功的关键。本篇文章转载自行业领域专家所写的一篇文章,希望大家阅读后可以能够有所收获。🌈 目录 🚀1.依托事实/证据,通过合理的逻辑,…

【MindSpore学习打卡】应用实践-热门LLM及其他AI应用-使用MindSpore实现K近邻算法对红酒数据集进行聚类分析

在机器学习领域&#xff0c;K近邻算法&#xff08;K-Nearest Neighbor, KNN&#xff09;是最基础且常用的算法之一。无论是分类任务还是回归任务&#xff0c;KNN都能通过简单直观的方式实现高效的预测。在这篇博客中&#xff0c;我们将基于MindSpore框架&#xff0c;使用KNN算法…

for nested data item, row-key is required.报错解决

今天差点被一个不起眼的bug搞到吐&#xff0c;就是在给表格设置row-key的时候&#xff0c;一直设置不成功&#xff0c;一直报错缺少row-key&#xff0c;一共就那两行代码 实在是找不到还存在什么问题... 先看下报错截图... 看下代码 我在展开行里面用到了一个表格 并且存放表格…

【算法】代码随想录之数组(更新中)

文章目录 前言 一、二分查找法&#xff08;LeetCode--704&#xff09; 二、移除元素&#xff08;LeetCode--27&#xff09; 前言 跟随代码随想录&#xff0c;学习数组相关的算法题目&#xff0c;记录学习过程中的tips。 一、二分查找法&#xff08;LeetCode--704&#xff0…

WEB安全基础:网络安全常用术语

一、攻击类别 漏洞&#xff1a;硬件、软件、协议&#xff0c;代码层次的缺陷。 后⻔&#xff1a;方便后续进行系统留下的隐蔽后⻔程序。 病毒&#xff1a;一种可以自我复制并传播&#xff0c;感染计算机和网络系统的恶意软件(Malware)&#xff0c;它能损害数据、系统功能或拦…

实战 | YOLOv8使用TensorRT加速推理教程(步骤 + 代码)

导 读 本文主要介绍如何使用TensorRT加速YOLOv8模型推理的详细步骤与演示。 YOLOv8推理加速的方法有哪些? YOLOv8模型推理加速可以通过多种技术和方法实现,下面是一些主要的策略: 1. 模型结构优化 网络剪枝:移除模型中不重要的神经元或连接,减少模型复杂度。 模型精…

大模型lora微调中,rank参数代表什么,怎么选择合适的rank参数

在大模型的LoRA&#xff08;Low-Rank Adaptation&#xff09;微调中&#xff0c;rank参数&#xff08;秩&#xff09;是一个关键的超参数&#xff0c;它决定了微调过程中引入的低秩矩阵的维度。具体来说&#xff0c;rank参数r表示将原始权重矩阵分解成两个低秩矩阵的维度&#…

突破传统,实时语音技术的革命。Livekit 开源代理框架来袭

🚀 突破传统,实时语音技术的革命!Livekit 开源代理框架来袭! 在数字化时代,实时通信已成为我们日常生活的一部分。但你是否曾想象过,一个能够轻松处理音视频流的代理框架,会如何改变我们的沟通方式?今天,我们就来一探究竟! 🌟 什么是 Livekit 代理框架? Live…

从零开始搭建互联网医院系统:技术与案例解析

随着信息技术的飞速发展和人们对医疗服务需求的增加&#xff0c;互联网医院逐渐成为医疗服务的重要模式。本文将详细介绍从零开始搭建互联网医院系统的关键技术和具体案例&#xff0c;帮助读者理解如何构建一个高效、可靠的互联网医院系统。 一、互联网医院系统的核心技术 1…

ESLint: Delete `␍`(prettier/prettier)解决问题补充

如果你是克隆的&#xff0c;参考这位大佬的文章 vue.js - Delete ␍eslint(prettier/prettier) 错误的解决方案 - 个人文章 - SegmentFault 思否 如果你是个人在本地实现&#xff0c;且改为 仍旧报错&#xff0c;我解决的方案&#xff1a; 改为&#xff0c;同时勾选和我配置一…

Error:sql: expected 1 arguments, got 2

一 背景 在测试一个API接口时&#xff0c;看到日志里面突然抛出一个错误&#xff1a;Error:sql: expected 1 arguments, got 2 看了下&#xff0c;对应的表里面是有相关数据的&#xff0c;sql语句放在mysql里面执行也是没问题&#xff01;那奇了怪了&#xff0c;为啥会产生这样…

TensorFlow系列:第二讲:准备工作

1.创建项目&#xff0c;选择虚拟环境 项目结构如下&#xff1a; data中的数据集需要提前准备好&#xff0c;数据分为测试集&#xff0c;训练集和验证集。以下是数据集的下载平台&#xff1a;kaggle 2.随便选择一个和水果相关的数据集&#xff0c;下载到本地&#xff0c;导入的项…

ARM裸机:一步步点亮LED(汇编)

硬件工作原理及原理图查阅 LED物理特性介绍 LED本身有2个接线点&#xff0c;一个是LED的正极&#xff0c;一个是LED的负极。LED这个硬件的功能就是点亮或者不亮&#xff0c;物理上想要点亮一颗LED只需要给他的正负极上加正电压即可&#xff0c;要熄灭一颗LED只需要去掉电压即可…

字节码编程javassist之生成带有注解的类

写在前面 本文看下如何使用javassist生成带有注解的类。 1&#xff1a;程序 测试类 package com.dahuyou.javassist.huohuo.cc;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import ja…

JVM原理(二四):JVM虚拟机锁优化

高效并发是从JDK 5升级到JDK 6后一项重要的改进项&#xff0c;HotSpot虛 拟机开发团队在这个版本上花费了大量的资源去实现各种锁优化技术&#xff0c;如适应性自旋( Adaptive Spinning)、锁消除( Lock Elimination)、锁膨胀(Lock Coarsening)、轻量级锁(Lightweight Locking)、…

了解PPO算法(Proximal Policy Optimization)

Proximal Policy Optimization (PPO) 是一种强化学习算法&#xff0c;由 OpenAI 提出&#xff0c;旨在解决传统策略梯度方法中策略更新过大的问题。PPO 通过引入限制策略更新范围的机制&#xff0c;在保证收敛性的同时提高了算法的稳定性和效率。 PPO算法原理 PPO 算法的核心…

LAMP万字详解(概念、构建步骤)

目录 LAMP Apache 起源 主要特点 软件版本 编译安装httpd服务器 编译安装的优点 操作步骤 准备工作 编译 安装 优化执行路径 添加服务 守护进程 配置httpd 查看 Web 站点的访问情况 虚拟主机 类型 部署基于域名的虚拟主机 为虚拟主机提供域名解析&#xff…

ESP32的I2S引脚及支持的音频标准使用说明

ESP32 I2S 接口 ESP32 有 2 个标准 I2S 接口。这 2 个接口可以以主机或从机模式&#xff0c;在全双工或半双工模式下工作&#xff0c;并且可被配置为 8/16/32/48/64-bit 的输入输出通道&#xff0c;支持频率从 10 kHz 到 40 MHz 的 BCK 时钟。当 1 个或 2 个 被配置为主机模式…

db期末复习自用[应试向 附习题]

第一章 数据库系统实现整体数据的结构化&#xff0c;主要特征之一&#xff0c;是db区别于文件系统的本质区别。 数据库系统三个阶段&#xff1a;人工、文件、数据库系统。 数据库管理系统的功能&#xff1a;数据库定义、操纵 、&#xff08;保护、存储、维护&#xff09;、数…

大模型/NLP/算法面试题总结2——transformer流程//多头//clip//对比学习//对比学习损失函数

用语言介绍一下Transformer的整体流程 1. 输入嵌入&#xff08;Input Embedding&#xff09; 输入序列&#xff08;如句子中的单词&#xff09;首先通过嵌入层转化为高维度的向量表示。嵌入层的输出是一个矩阵&#xff0c;每一行对应一个输入单词的嵌入向量。 2. 位置编码&…