Redis中的Zset类型

目录

Zset的相关命令

zadd

zrange

zcard

zcount

zrevrange

zrangebyscore

zpopmax

bzpopmax

zpopmin和bzpopmin

zrank

zrevrank

zscore

zrem

zremrangebyrank

zremrangebyscore

操作集合间的命令

zinterstore和zunionstore

内部编码

Zset的应用场景


Zset表示有序集合的意思.

有序集合保留了集合不能有重复元素的特性,同时,有序集合里的元素总是以升序排列的.

说到排序,要指定一个排序的规则,zset为了实现排序规则,给zset中的member同时引入了一个属性-分数(score),浮点类型.每个member都会安排一个分数.进行排序的时候,就是依照此处的分数大小来进行升序排序的.

zset中的元素是唯一的,但是分数可以重复.

Zset的相关命令

zadd

添加或者更新指定的元素以及关联的分数到zset中,分数应该符合double类型.+inf/-inf作为正负数极限也是合法的.

member和score称为是一个pair.不要把member和score理解成键值对.键值对中是有明确的角色区分的,谁是键谁是值是明确的,一定是根据键来找到对应的值.而对于有序集合来说,既可以通过member找到对应的score,又可以通过score找到匹配的member.

我们在添加的时候既要添加member也要添加分数,而且是分数在前,member在后.

XX:member存在才更新元素,不会添加新的元素.

NX:member不存在才创建新的member,不会更新已经存在的member.

不加XX或者NX:如果当前member不存在,此时就会达到添加新member的效果;如果member已经存在,此时就会更新分数.

LT:less than的缩写,member已经存在,如果更新分数,新的分数比旧的分数小,此时就更新成功,否则就不更新.member不存在,就创建member.

GT:greater than的缩写,member已经存在,如果更新分数,新的分数比旧的分数要大,此时就更新成功,否则就不更新.member不存在,就创建新的member.

CH:zadd本来只返回新增的元素个数,加上CH,就会将改变的member也算上.

INCR:对member的分数加上对应值.如果member不存在,默认其原始的分数为0,并且创建member.

当使用incr的时候,此条命令只能针对一个member-score使用,不能同时操作多组了.

时间复杂度是O(logN).之前hash,set,list很多时候添加一个元素都是O(1).此处的zset是logN,是因为zset是有序结构,要求新添加的元素要放到合适的位置上,找到合适的位置时间复杂度就是logN.

之所以是logN不是N,也是充分利用了有序这样的特点.

当多个元素的分数相同时,它们会按照member的字典序进行排序.


zrange

查看有序集合中的元素详情.

类似于lrange,可以指定一对下标构成的区间.

因为有序集合本身就是有先后顺序的,谁在前谁在后都是明确的,因此也就可以给这个有序集合赋予下标这样的概念了.

当前的查询结果就是按照升序来排列的.

如果修改的分数,影响到了之前的顺序,就会自动的移动元素的位置,保持原有的升序顺序不变.

时间复杂度为O(log(N)+M),N为集合中总的元素个数,M为区间内的元素个数.


zcard

zcard key用来获取一个zset的基数,即zset中的元素个数.

返回的是zset中的元素个数.

zcount

返回分数在min和max之间的元素个数,默认情况下,min和max都是包含的.如果想要排除边界值,可以加上括号(.

时间复杂度是O(logN).

zcount先根据min找到对应的元素,此时时间复杂度为logN;在根据max找到对应的元素,花费logn.再根据下标做减法,就知道区间里有几个元素了.没有去遍历区间里的元素,所以总的时间复杂度为O(logN).

注意这里的min和max也可以写成浮点数,因为zset中的分数本身就是浮点数.

zrevrange

rev->reverse代表逆序的意思,此时就是按照分数的降序进行遍历并打印了.

zrangebyscore

按照分数来找元素,和刚才的zcount类似.

时间复杂度是O(log(N)+M).

此命令将在未来的版本中废弃(当前为redis5),并且功能将合并到zrange中.

zpopmax

删除并返回分数最高的count个元素.

返回值就是被删除的元素,包括member和score.

如果存在多个元素的分数相同,同时为最大值,此时zpopmax删除的时候,仍然只删除其中一个元素.

因为分数相同会按照member字符串的字典序来决定先后,所以总有一个顺序.

时间复杂度为O(log(N)*M).

N是有序集合的总的元素个数,M是要删除的元素个数.

此处的删除最大值就相当于是尾删,其实redis内部针对有序集合是记录了尾部这样的位置,那我们就可以通过O(1)的时间复杂度来找到这个元素.但是redis内部并没有这样实现,而是根据member的值进行查找找到位置后在删除.


bzpopmax

这是一个带有阻塞功能的命令.

我们的有序集合可以视为是一个优先级队列,有的时候,也需要一个带有阻塞功能的优先级队列.

每个key都是一个有序集合,阻塞也是在有序集合为空的时候触发,一直阻塞到其他客户端往有序集合中插入元素或者超过了阻塞的最大时间.

如果有序集合中有元素了,直接就能返回了,就不会阻塞了.

timoout表示超时时间,最多阻塞多长时间,单位是s,支持小数形式,写作0.1就表示100ms.

时间复杂度为O(logN),删除最大值所需要花费的时间.

注意这里的时间复杂度不是O(log(N)*M),M表示监听的key的个数.虽然监听了多个key,但是我们最终只需要在这多个key中删除一个最大值即可,而不是每个key里都删除一次,所以时间复杂度为logN.

zpopmin和bzpopmin

这两条命令的和上述的zpopmax和bzpopmax逻辑是一致的.只不过是删除有序集合中最小的元素.

zrank

返回指定元素的排名,升序.

时间复杂度是O(logN).

zrank得到的下标是从前往后算的,升序.

排名是从0开始的.

zrevrank

也是获取member的下标,但是下标是反着算的,从后往前.

zscore

返回指定元素的分数.

根据member查找分数.

时间复杂度为O(1).此处redis对于这样的查询操作做了优化,付出了额外的空间代价,针对这里的时间复杂度又滑到了O(1).

zrem

删除指定的元素.

返回的是本次操作删除的元素个数.

时间复杂度为O(log(N)*M),N为有序集合中的元素个数,M为要删除的元素个数.

zremrangebyrank

按照升序,删除指定范围内的元素,闭区间.

O(log(N)+M),N是整个有序集合的元素个数,M是区间内的元素个数.

此处查找位置,只需要进行一次,不需要重复进行.

zremrangebyscore

指定一个删除的区间,通过分数来描述.默认是闭区间,可以用(排除边界值.

时间复杂度O(log(N)+M).

zincrby

为指定的元素的关联分数添加指定的分数值.

返回的是增加后元素的分数.

时间复杂度为O(logN).


操作集合间的命令

zinter,zunion,zdiff这几个命令是从redis6.2开始支持的,redis5支持的命令有zinterstore和zunionstore.

zinterstore:求交集,结果保存到另一个key中.

zunionstore:求并集,结果保存到另一个key中.

zinterstore和zunionstore

destination:要把结果保存到那个key对应的zset中.

numkeys:是一个整数,描述了后续有几个key参与交集运算.

weights:权重,此处的集合是有序集合,每一个member都带有分数,此处指定的权重就相当于一个系数,在集合间进行操作的时候,会让有序集合中的member的分数乘上对应的权重.

aggregate:表示最终结果集合中的分数是如何计算的,sum表示分数加和,min表示取最小的分数,max表示取最大的分数.

时间复杂度:

这里的时间复杂度如何计算取决于redis源码是如何实现上述求交集操作的.

当不加任何选项的时候,默认权重都是1,计算结果分数用的是各分数的和.

加上权重的效果如上.

加上aggregate的效果如上.

zunionstore和zinterstore用法一致,只是zunionstore求的是并集.

时间复杂度:


内部编码

有序集合的内部编码有两种,压缩列表和跳表.

ziplist当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个), 同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。

skiplist:当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降。


Zset的应用场景

Zset最关键的应用场景就是排行榜系统,例如微博热搜,游戏天梯排行,成绩排行等等.

这类排行榜的关键要点是用来排行的"分数"要求是实时变化的.

使用zset来完成上述操作就非常契合了.

比如游戏天梯排行,只需要把玩家信息和对应的分数给放到有序集合当中即可.此时就自动形成了一个排行榜,随时可以按照排行(下标),按照分数来进行范围查询.随着分数发生改变,也可以比较方便的通过incrby命令来修改分数,排行顺序也会自动调整.

对于要综合考虑各个维度的排行榜,比如微博热搜榜,我们可以使用有序集合间的命令来完成.

比如微博热度要综合考虑浏览量,点赞量,转发量和评论量,此时我们可以把这些都用有序集合来表示.

根据每个维度来计算综合得分,给不同的维度赋予不同的权重,此时就可以借助zinterstore或者zunionstore的加权方式来处理了.

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

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

相关文章

计算一棵二叉树的单分支数(c语言代码实现)

本题代码如下 int num(tree t) {if (!t)return 0;else if ((t->lchild && t->rchildNULL)|| (t->lchildNULL&& t->rchild))//计算单支树return num(t->lchild) num(t->rchild) 1;else return num(t->lchild) num(t->rchild); } 完…

2014年亚太杯APMCM数学建模大赛C题公共基础课教师专业化培养方式研究求解全过程文档及程序

2014年亚太杯APMCM数学建模大赛 C题 公共基础课教师专业化培养方式研究 原题再现 近年来,世界基础工业、信息产业、服务业的跨越式发展引发了大量人才需求,导致了职业教育的飞速发展,除原有专科层次高等职业教育院校外,大量普通…

中国联通携手华为助力长城精工启动商用5G-A柔性产线

[中国,河北,2023年11月3日] 近日,中国联通携手华为助力精诚工科汽车系统有限公司保定自动化技术分公司(简称长城精工自动化)启动5G-A超高可靠性超低时延柔性产线的商用阶段。 在河北保定长城汽车制造产线,…

云端生成式 AI – 基于 Amazon EKS 的 Stable Diffusion 图像生成方案

Stable Diffusion 是当下生成式 AI 领域最受欢迎的开源多模态语言-图像模型,由于其易用的接口和良好的使用体验,受到了开源社区和广大设计行业从业者的追捧。Stable Diffusion 模型版本正在快速迭代,并带动了各行各业的生产力变革。目前市场上…

【解密ChatGPT】:从过去到未来,揭示其发展与变革

🎊专栏【ChatGPT】 🌺每日一句:天行健,君子以自强不息,地势坤,君子以厚德载物 ⭐欢迎并且感谢大家指出我的问题 文章目录 一、ChatGPT的发展历程 二、ChatGPT的技术原理 三、ChatGPT的应用场景 四、ChatGPT的未来趋势 五、总结 引言:随着…

Azure 机器学习 - 使用Python SDK训练模型

目录 一、环境准备二、工作区限制三、什么是计算目标?四、本地计算机五、远程虚拟机六、Apache Spark 池七、Azure HDInsight八、Azure Batch九、Azure Databricks十、Azure Data Lake Analytics十一、Azure 容器实例十二、Kubernetes 了解如何用 SDK v1 将 Azure 计…

2023-mac rz sz 安装

之前安装过一次,没问题,这次按照之前教程装了就不管上传下载都会卡住; step1: brew install lrzsz step2:在/usr/local/bin 路径下配置两个sh,之前从网上找到的直接用都不对,下面这个是调试过的正式可用的 iterm2…

golang工程中间件——redis常用结构及应用(string, hash, list)

Redis 命令中心 【golang工程中间件——redisxxxxx】这些篇文章专门以应用为主,原理性的后续博主复习到的时候再详细阐述 string结构以及应用 字符数组,redis字符串是二进制安全字符串,可以存储图片等二进制数据,同时也可以存…

1-前端基本知识-CSS

1-前端基本知识-CSS 文章目录 1-前端基本知识-CSS总体概述什么是CSS?CSS引入方式行内式内嵌式连接式/外部样式表 CSS选择器元素选择器id选择器class选择器(使用较广) CSS浮动CSS定位静态定位:static绝对定位:absolute相…

深度学习之基于YoloV5-Deepsort人物识别与追踪系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 YoloV5-Deepsort是一种基于深度学习的人物识别与追踪系统,具有较高的准确率和实时性能。 YoloV5是一种…

在maven官网中如何下载低版本的maven

链接:https://archive.apache.org/dist/maven/maven-3/

[ACTF2020 新生赛]Upload 1

题目环境: 仍旧是文件上传漏洞 这道题和上一道大差不差、大同小异、这里不再赘述。 [极客大挑战 2019]Upload 1:https://blog.csdn.net/m0_73734159/article/details/134267317?spm1001.2014.3001.5501 区别在于本题需要在抓包数据里面改文件后缀&#…

关于WMS三个核心问题的解读

一、企业是否需要上WMS系统,可以从以下五个方面入手: 1.库存管理状况:了解企业的库存管理状况,是否存在库存冗余、漏洞、过度采购、库存盘点不准确等问题。 2.物流效率水平:需要了解企业物流效率水平,包括…

【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…

【蓝桥杯选拔赛真题13】C++最短距离 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

C/C++最短距离 第十二届青少组蓝桥杯C++选拔赛真题 一、题目要求 1、编程实现 有一个居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1,2,3……,当排满一行时,从下一行相邻的楼往反方向排号。 例如:小区为 3 行 6 列,矩阵排列方式: 要求:已知小区…

如何在CPU上进行高效大语言模型推理

大语言模型(LLMs)已经在广泛的任务中展示出了令人瞩目的表现和巨大的发展潜力。然而,由于这些模型的参数量异常庞大,使得它们的部署变得相当具有挑战性,这不仅需要有足够大的内存空间,还需要有高速的内存传…

【STM32】定时器

systick定时器: 【STM32】Systick定时器-CSDN博客 0.通用定时器框图 1.时钟源 2.控制器 3.输入捕获 计数器实际上是与比较寄存器的影子寄存器进行比较的。 4.输出比较 1.STM32的定时器学习要点 参考手册 STM32F1xx中文参考手册.pdf 林何/STM32F103C8 - 码云 -…

sql学习笔记(三)

目录 1.四舍五入 2.向上取整 3.向下取整 4.Hive 分区 5.case when条件语句 6.日期函数 7.字符串函数 8.窗口函数 1️⃣排序函数 1.四舍五入 round select round(3.14) —>3 2.向上取整 ceiling select ceiling(12.15) —>13 3.向下取整 floor select flo…

centos获取服务器公网ip

查看公网IP 用下面几个命令: #curl ifconfig.me #curl icanhazip.com #curl cip.cc

现一个智能的SQL编辑器

补给资料 管注公众号:码农补给站 前言 目前我司的多个产品中都支持在线编辑 SQL 来生成对应的任务。为了优化用户体验,在使用 MonacoEditor 为编辑器的基础上,我们还支持了如下几个重要功能: 多种 SQL 的语法高亮多种 S…