Redis-带你深入学习数据类型zset

目录

1、zset有序集合

2、zset相关命令

2.1、添加或更新指定的元素——zadd

2.2、获取有序集合zset的元素个数相关命令:zcard、zcount

2.3、返回指定区间元素相关命令:zrange、arevrange、zrangebyscore

2.4、删除相关命令:zpopmax、zpopmin、bzpopmax、bzpopmin、zrem、zremrangebyrank、zremrangebyscore

2.5、返回指定元素的排名——zrank、zrevrank

2.6、返回指定元素的分数——zscore

2.7、为指定的元素的关联分数添加指定的分数值——zincrby

2.8、集合间操作:zinterstore、zunionstore

3、应用场景


1、zset有序集合

         zset中使用的是member和score【score为一个浮点数】,而不是键值对key value;

score member和key vlaue的区别;score有两个特殊取值:inf 无穷大 ,-inf无穷小 ---二者的绝对值都是无限大的~

  • member score:既可以通过member找score,也可以通过score找member
  • key value:只能通过key来找对应的value

zset的特点:

  • 有序的---按照分数升序排列,分数score相同的按照member的字典序排列
  • member值需要唯一,score可以不唯一

2、zset相关命令

2.1、添加或更新指定的元素——zadd

  • zadd:添加或更新指定的元素以及关联的分数到zset中
  • 语法:zadd key [ NX | XX ] [ CH ] [ INCR ] score member [score member...]
  • 参数说明1:[NX |XX]:不添加此参数时,默认为如果member存在,则更新score值,如不存在,则会添加member;NX:如果member存在则直接返回,不存在则新增member;XX:如果member存在则更新score,不存在则直接返回
  • 参数说明2:CH:修改返回值,默认返回值为新增member的个数,添加该参数后,返回值为新增member的个数加上score被修改的个数
  • 参数说明3:INCR:给指定的某一个score加上指定的值,注意:该参数一次只能操作一个member;使用该参数时,返回被修改为:返回的是给定的score加上指定值后,新的score的值
  • 参数说明4:[score member...]--->支持一次添加或指定更新多个member
  • 参数补充:更新版本的Redis,添加了一个参数:[LT | GT]。默认是若member存在,则修改score;LT:less than--member存在时,更新score,只有当给定的新的分数小于原来的分数才能修改成功;greater than--member存在时,更新score,只有当给定的新的分数大于原来的分数才能修改成功
  • 返回值:默认为新增成功的元素个数,特殊情况在上述的参数说明已经提及了~
  • 时间复杂度:logN--zset内部数据结构主要是跳表,每次新增或修改后,内部都会进行再次排序,保证zset内部一直是有序的,具体怎么推导出时间复杂度是logN,后续文章会持续更新的~

举例:

2.2、获取有序集合zset的元素个数相关命令:zcard、zcount

zcard:获取一个zset的基数,也就是zset中某个key的元素个数

  • 语法:zcard key
  • 返回值:zset中某key中的元素个数
  • 时间复杂度O(1)

举例:

zount:获取指定分数区间内的元素个数

  • 语法:zount key min max
  • 参数说明:min和max都是默认包含的,不想包含的话,需要在min或max左边加上左括号(
  • 返回值:指定区间的元素个数
  • 时间复杂度O(logN)----根据min找到对应的元素,再根据max找到对应的元素,查询到元素后就可以获取到他的次序,也就是下标,直接对应下标相减即可~

举例:

2.3、返回指定区间元素相关命令:zrange、zrevrange、zrangebyscore

zrange:返回指定区间内的元素,按分数升序排列

  • 语法:zrange key start stop [withscores]
  • 参数说明:默认返回member值,加上该参数后,会带着分数一起返回;start sotp支持负数
  • 返回值:区间内元素的列表
  • 时间复杂度O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数

举例:

zrevrange:返回指定区间内的元素,按照分数降序排列---注意这里的按照降序是,将原本的整个zset先进行降序排列,具体下标也会随之变化,例如原本ll是在下标为len-1的地方,降序调整后,ll是在下标为0的地方~

  • 语法:zrevrange key start stop [withscores]
  • 返回值:区间内的元素列表
  • 时间复杂度:O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数

举例:

zrangebyscore:返回某分数段之间的元素

  • 语法:zrangescore key min max [withscores] 
  • 参数说明1:默认为闭区间,使用 ( 可以调整为开区间
  • 返回值:区间内的元素列表
  • 时间复杂度O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数
  • 该命令在6.2.0之后的版本中废弃了,功能合并至zrang命令中

举例:

2.4、删除相关命令:zpopmax、zpopmin、bzpopmax、bzpopmin、zrem、zremrangebyrank、zremrangebyscore

zpopmax:删除并返回分数最高的count个元素,默认为1

  • 语法:zpopmax key [count]
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  

举例;

zpopmin:删除并返回分数最低的count个元素,默认为1

  • 语法:zpopmin key [count]
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  

举例:

bzpopmax:zpopmax阻塞版本

  • 语法:bzpopmax key [key...] timeout
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  
  • 该命令阻塞时,redis依旧可以处理其他命令

bzpopmin:zpopmin阻塞版本

  • 语法:bzpopmin key [key...] timeout
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  
  • 该命令阻塞时,redis依旧可以处理其他命令

zrem:删除指定元素

  • 语法:zrem key member [member...]
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(M*log(N))-----N:整个集合中元素个数;M:member的个数

举例;

zremrangebyrank:按照升序,删除指定范围的元素

  • 语法:zremrangebyrank key start stop
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(log(N)+M)

举例:

zremrangebyscore:按照分数删除指定区间范围的元素

  • 语法:zremrangebyscore key min max
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(log(N)+M)

举例:

2.5、返回指定元素的排名——zrank、zrevrank

zrank:返回指定元素的排名-升序

  • 语法:zrank key member
  • 返回值:该member的排名
  • 时间复杂度:O(logN)

举例:

zrevrank:返回指定元素的排名-降序【集合以降序排列,指定元素的排名】

  • 语法:zrevrank key member
  • 返回值:排名
  • 时间复杂度:O(logN)

举例:

2.6、返回指定元素的分数——zscore

  • zscore:返回指定元素的分数
  • 语法:zscore key member
  • 返回值:分数
  • 时间复杂度:O(1)----这里也是要进行查询操作,为什么时间复杂度不是O(logN)呢?因为redis中对于这样的查询操作做了特殊优化,付出了额外的空间代价~

举例:

2.7、为指定的元素的关联分数添加指定的分数值——zincrby

  • 语法:zincrby key incrment member
  • 返回值:增加后元素的分数
  • 时间复杂度:O(logN)

举例:

2.8、集合间操作:zinterstore、zunionstore

zinterstore:几个集合的交集,并将结果保存到另一个key中

  • 语法:zinterstore destination numkeys key [key...] [WEIGHTS weight] [AGGREATE sum | min | max]
  • 参数说明1:destination指的是交集结果存入到的目标key
  • 参数说明2:numkeys指的是个数,后面有多少个key的个数。因为后面可能还有会其它参数,为了将key值与其他的参数做区分~
  • 参数说明3:weights-->指的是指定每个key所占的权重,看下图举例中的最后一个命令,weights后面跟了一个 1 和 4,意思就是给前面对应位置的key1乘1,对应的key2乘4~【在应用场景排行榜中,例如总综测成绩排名可能涉及到成绩,和课外活动,而成绩占比百分之七十,课外活动占三十,就可以使用这个命令来解决此类问题】
  • 参数说明4:AGGREATE-->解决的是在取交集时,number相同而score不同时,应当以谁为准,sum指score相加,min取最大小的score,max取最大的score【默认取sum】
  • 返回值:目标集合中的元素个数
  • 时间复杂度:O(N*K)+O(M*log(M))----N:输入的有序集合中,最小的集合的元素个数;K:输入了几个有序集合;M:最终结果的有序集合的元素个数

举例:

zunionstore:几个集合的并集,并将结果保存到另一个key中

  • 语法:zunionstore destination numkeys key [key...] [WEIGHTS weight] [AGGREATE sum | min | max]
  • 参数说明:同上zinterstore~
  • 返回值:目标集合中的元素个数
  • 时间复杂度:O(N)+O(M*log(M))----N:输入的有序集合中,最小的集合的元素个数;K:输入了几个有序集合;M:最终结果的有序集合的元素个数  【上一个命令zinterstore命令的时间复杂度,k一般不会太大,可看为1,这样看两个命令的时间复杂度就是一样的了~】

举例:


3、应用场景

        排行榜——使用redis的zset实现排行榜,能够实时的保证排行榜的更新~

好啦,下期见咯~

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

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

相关文章

$ref赋值之后,子组件不渲染(刷新后,$ref父组件传值,子组件不更新数据问题)

在父组件中,点击搜索, 通过this.$refs传值给子组件 this.$refs.GoodsClassNav.paramsAll.keyword key; 子组件结果中不显示, 但是打印this.$refs.GoodsClassNav.paramsAll.keyword,可以打印到最新的值,点击子组件中…

PyQt5通过堆叠布局实现选项卡(多界面)功能

PyQt5通过堆叠布局实现选项卡(多界面)功能 1、创建一个MainWindow 加入Text Brower做标题,几个按钮。 然后在左侧containers中添加Stacked Widget这个控件,初步布局如下: 对窗口中的堆叠容器 “Stacked Widget”,选中后可以用…

【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)

目录 1 Pandas 可视化功能 2 Pandas绘图实例 2.1 绘制线图 2.2 绘制柱状图 2.3 绘制随机散点图 2.4 绘制饼图 2.5 绘制箱线图A 2.6 绘制箱线图B 2.7 绘制散点图矩阵 2.8 绘制面积图 2.9 绘制热力图 2.10 绘制核密度估计图 1 Pandas 可视化功能 pandas是一个强大的数…

常驻巨噬细胞诱导的纤维化在胰腺炎性损伤和PDAC中具有不同的作用

介绍一篇2023年8月10日发表在Nature Immunology的文章 标题: Fibrosis induced by resident macrophages has divergent roles in pancreas inflammatory injury and PDAC 影响因子:30.5 DOI:https://doi.org/10.1038/s41590-023-01579-x …

web端动效 PAG

之前写过一篇lottie动效的文章:web端动效 lottie-web 使用,本篇写一下PAG-web的基础使用。 PAG是腾讯开发,支持移动端、桌面端以及Web端的动效工作流解决方案。目标是降低或消除动效相关的研发成本,能够一键将设计师在 AE&#x…

TensorFlow 03(Keras)

一、tf.keras tf.keras是TensorFlow 2.0的高阶API接口,为TensorFlow的代码提供了新的风格和设计模式,大大提升了TF代码的简洁性和复用性,官方也推荐使用tf.keras来进行模型设计和开发。 1.1 tf.keras中常用模块 如下表所示: 1.2 常用方法 …

Ei Scopus检索 | 2024年第四届能源与环境工程国际会议(CoEEE 2024)

会议简介 Brief Introduction 2024年第四届能源与环境工程国际会议(CoEEE 2024) 会议时间:2023年5月22日-24日 召开地点:意大利米兰 大会官网:www.coeee.org CoEEE 2024将围绕“能源与环境工程”的最新研究领域而展开,为研究人员、…

VSCODE 使用技巧

vscode批量去掉代码中空行的方法 1、在vscode中使用ctrl f组合快捷键打开替换窗口. 2、输入下面的正则表达式 ^\s*(?\r?$)\n https://mp.weixin.qq.com/s/ZKV2sZWszxBLNTNLEWhsng

springboot redisTemplate.opsForValue().setIfAbsent返回null原理

一、版本 springboot版本:spring-boot-starter-data-redis 2.1.6 redisson版本:redisson-spring-boot-starter 3.11.5 二、场景 Boolean res redisTemplate.opsForValue().setIfAbsent("key","value");以上代码同一时间多次执行…

Sentinel控制台配置 持久化到nacos

sentinel控制台,使用方便,功能强大。使用官方的jar包,配置不会持久化,sentinel重启后会导致,之前的规则全部丢失,下面一起改造源码实现规则数据的持久化 sentinel源码地址 (github访问太慢&am…

嵌入式学习笔记(25)串口通信的基本原理

三根通信线:Tx Rx GND (1)任何通信都要有信息作为传输载体,或者有线的或则无线的。 (2)串口通信时有线通信,是通过串口线来通信的。 (3)串口通信最少需要2根&#xff…

MCU芯片测试:性能指标测试痛点是什么?ATECLOUD能否解决?

MCU芯片测试指标的核心是性能指标,包括处理器性能、存储器容量和读写速度,外设性能等。芯片测试对自动化测试的要求很高,ATECLOUD-IC不仅解决了传统测试方法的问题,而且也可以满足芯片测试的高要求,高效地完成MCU芯片性…

ChartJS使用-环境搭建(vue)

1、介绍 Chartjs简约不简单的JavaScript的图表库。官网https://chart.nodejs.cn/ Chart.js 带有内置的 TypeScript 类型,并与所有流行的 JavaScript 框架 兼容,包括 React 、Vue 、Svelte 和 Angular 。 你可以直接使用 Chart.js 或利用维护良好的封装程…

SpringBoot课堂笔记20230913

本篇文章为SpringBoot学习笔记,方便自己再复习。 Maven:jar包管理工具 注解: Controller:处理http请求,返回的视图 RestController: 相当于ResponseBody和Controller一起用,返回的是json ResponseBody:返回响应内容 …

自动化监控系统PrometheusGrafana

Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,数据采集→数据处理→数据存储→数据展示→告警 Prometheus 特点展开…

摩洛哥6.9级地震 网络出现轻度中断

北京时间2023年9月9日6时11分(当地时间8日23时11分),摩洛哥发生6.9级强震。埃文科技的监测数据显示,受地震影响,摩洛哥地区的网络也出现了轻度中断。 9月9日6时10分后,摩洛哥地区活跃前缀数量开始减少,在6时50分左右达…

利用 Python 中的地理空间数据与 GeoPandas

推荐:使用 NSDT编辑器快速搭建3D应用场景 空间数据的真正潜力在于它能够连接数据点及其各自的位置,为高级分析创造无限的可能性。地理空间数据科学是数据科学中的一个新兴领域,旨在利用地理空间信息并通过空间算法和机器学习或深度学习等先进…

算法通关村第十九关:白银挑战-动态规划高频问题

白银挑战-动态规划高频问题 1. 最少硬币数 LeetCode 322 https://leetcode.cn/problems/coin-change/description/ 思路分析 尝试用回溯来实现 假如coins[2,5,7],amount27,求解过程中,每个位置都可以从[2,5,7]中选择,因此可以…

error:Failed building wheel for XXX

解决方案适用于大多数的pip 安装时出现的Failed building wheel for XXX 出现问题 按以往快速安装包的经验,第一反应当然是使用简单又快捷的terminal命令加上镜像,如下: pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple结…

关闭训练过程中的wandb

训练的过程中反复提醒wandb的账户,自动化执行的话,不是很方便,因此需要关闭这个wandb的功能 提醒的方式是这样的: 解决办法1、注释掉wandb相关的代码,并且添加关闭命令:wandb None 参考: 训…