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.mzph.cn/news/77897.shtml

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

相关文章

最优化:建模、算法与理论(优化建模——2)

3.10 K-均值聚类 聚类分析是 统计学中的一个基本问题,其在机器学习,数据挖掘,模式识别和图像分析中有着重要应用。聚类不同于分类,在聚类问题中我们仅仅知道数据点本身,而不知道每个数据点具体的标签。聚类分析的任务…

理财是什么?怎样学习理财?

大家好,我是财富智星,今天跟大家分享一下理财是什么?怎样学习理财的方法。 一、理财的基本原则 1、理财应注重投资而不是投机,要与时间为友。 让我们先考虑以下问题:什么样的回报才算是真正的高回报?假设有…

TypeScript命名空间和模块

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 命名空间(Namespace) 命名空间(Namespace)使用场景 第三方库 兼容…

linux rz乱码文件删除

通过rz上传文件的时候经常会遇到 文件乱码问题,删又删不掉。 使用rz -be的方法上传 遇到乱码文件操作步骤 1. ls -i # 列出文件的编号 2. find . -inum 29229139 -delete # 根据编号删除文件 find 需要扫描的路径 -inum 文件编号 -delete

Vue.js not detected解决方法

扩展程序》管理扩展程序》详情》允许访问文件地址打开

软件测试7大误区

随着软件测试对提高软件质量重要性的不断提高,软件测试也不断受到重视。但是,国内软件测试过程的不规范,重视开发和轻视测试的现象依旧存在。因此,对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&#xf…

Vulnhub系列靶机---HarryPotter-Fawkes-哈利波特系列靶机-3

文章目录 信息收集主机发现端口扫描dirsearch扫描gobuster扫描 漏洞利用缓冲区溢出edb-debugger工具msf-pattern工具 docker容器内提权tcpdump流量分析容器外- sudo漏洞提权 靶机文档:HarryPotter: Fawkes 下载地址:Download (Mirror) 难易程度&#xff…

C++面试/笔试准备,资料汇总

文章目录 后端太卷,建议往嵌入式,qt,测试,音视频,C一些细分领域投简历。有任何疑问评论区聊,我看到了回复 C面试/笔试准备,资料汇总自我介绍项目实习尽可能有1.编程语言:一.熟悉C语言…

【牛客面试必刷TOP101】Day4.BM15删除有序链表中重复的元素-I和BM17二分查找-I

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…

前端面试题JS篇(6)

ES6 Module 和 CommonJS 模块的区别: CommonJS 是对模块的浅拷⻉,ES6 Module 是对模块的引⽤,即 ES6 Module 只存只读,不能改变其值,也就是指针指向不能变,类似 const; import 的接⼝是 read-o…

ATFX汇市:离岸人民币大幅升值,昨日盘中跌破7.3关口

ATFX汇市:美国CPI数据即将公布之际,周一美元指数大跌,带动离岸人民币升值0.85%,实现3月14日以来的最大单日升值幅度,当日汇率(USDCNH)最低触及7.292,突破7.3000关口。消息面上&#…

【LangChain系列 8】Prompt模版——少样本prompt模版(二)

原文地址:【LangChain系列 8】Prompt模版——少样本prompt模版(二) 本文速读: 固定少样本prompt模版 动态少样本prompt模版 在上篇文章中介绍了少样本模版的基本用法,本文将介绍 对话模型(chat model) 中 少样本prompt模版的用法。 LangCh…

Gogs国内大佬开发的git私有服务

Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。 gogs官网:https://gogs.io/ github地址:https://github.com/gogs/gogs/tree/main/docker docker安装gogs服务 docker pull gogs/gogs 启动gogs容器 docker run --namegogs -…

《TCP/IP网络编程》阅读笔记--基于UDP的服务器端/客户端

目录 1--TCP和UDP的主要区别 2--基于 UDP 的数据 I/O 函数 3--基于 UDP 的回声服务器端/客户端 4--UDP客户端Socket的地址分配 5--UDP存在数据边界 6--UDP已连接与未连接的设置 1--TCP和UDP的主要区别 ① TCP 提供的是可靠数据传输服务,而 UDP 提供的是不可靠…

现成Hadoop配置,图文手把手交你

为了可以更加快速的可以使用Hadoop,便写了这篇文章,想尝试自己配置一下的可以参考从零开始配置Hadoop,图文手把手教你,定位错误 资源 1.两台已经配置好的hadoop 2.xshellVmware 链接:https://pan.baidu.com/s/1oX35…

性能测试 —— Jmeter定时器

固定定时器 如果你需要让每个线程在请求之前按相同的指定时间停顿,那么可以使用这个定时器;需要注意的是,固定定时器的延时不会计入单个sampler的响应时间,但会计入事务控制器的时间 1、使用固定定时器位置在http请求中&#xf…

用 Github Codespaces 免费搭建本地开发测试环境

如何丝滑地白嫖一个本地开发环境?怎么新建一个代码空间? 1:通过Github网页新建2:通过VSCode插件新建 为代码创建相应的开发测试环境 如何丝滑地白嫖一个本地开发环境? 使用Codespaces为开发者解决这样的痛点&#xf…

基于STM32智能环境系统

摘要 本系统采用stm32f407作为主控芯片,实现对环境的监测。并且通过和手机通信,获取当前的天气预报信息,结合当前测得的温湿度,可以为用户提供出行建议。利用stm32自带的RTC可以实现时间及闹钟功能。此外RTC还可以用于电子日历的…

数分面试题2-牛客

1、面对大方差如何解决 1,AB实验场景下,如果一个指标的方差较大表示它的波动较大,那么实验组和对照组的显著差异可能是因为方差较大即随机波动较大。解决方法有:PSM方法、CUPED(方差缩减) PSM代表"Propensity Score Matchin…

phpstudy本地快速搭建网站,并外网访问【无公网IP】

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点,测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中,查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…