Redis数据结构之zset

一.zset有序集合

它和集合唯一不同的就是,有序集合中的每一个元素都有一个唯一对应的浮点类型的分数与之关联着,是的有序集合中的元素可以维护有序性。

但是这个有序不适用下标作为排序的依据,而是使用这个分数。就好像排行榜一样,谁得到的分数多,就排在前面

所以这里的有序和list中的有序的概念不一样,这里强调升序/降序

注意zset中的member还是不能够重复,但是分数可以重复

二.相关命令

1.zadd

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member……]
xx只能针对于已经存在的member进行分数的修改
nx只能添加新的member,不能对已经存在的元素进行修改
lt(less than)当新修改的元素的分数小于原始分数时,就能修改),gt反之
ch 是改变这个命令的返回值,之前它是返回zset集合中的元素个数,现在是返回被修改的元素的个数,其中被修改的元素包括了新添加的元素
incr和zincrby效果一样,给指定的member加上指定的分数,返回值就是新的分数
每一个元素添加到时间复杂度都是O(logN)N是set中的元素个数
由于zset是有序的,所以要找位置。当然之所以不是O(N),也是利用了有序的特点,zset的内部数据结构主要是跳表

2.zrange

zrange key start stop (withscores)

如上,zset就是一个升序的集合,返回值也是按照升序排列的

3.zcard

返回集合中的元素个数

4.zcount

zcount key minscore maxscore

返回minmax之间的元素个数,闭区间

如果像去掉边界值,就可以加上括号

比如不想要左边的边界:zcount z1 (90 96

如果右边的边界也不想要:zcount z1 (90 (96  注意,是左边加括号!!!!!

时间复杂度O(logN)先根据min找到对应的元素,再根据max找到对应的元素,然后进行一个区间遍历,就能知道元素个数了,所以就是O(logN+M)

实际上,zset集合内部,会记录每一个元素的当前排行/次序,查询到元素,就直接知道了元素所在的次序,就可以直接把max和min对应的元素下标相减,就能得到元素个数,所以直接就是O(logN)

min max可以写成浮点数,因为score本身就是浮点数

在浮点数中,有俩个特殊值:inf和-inf,zset可支持inf和-inf作为max和min

5.zrevrange

zrevrange key start stop withscores

reverse逆序,将升序改成降序

6.zrangebyscore 

zrangebyscore key min max [withscores] 按照分数找元素,和刚才的zcount类似,不过这个是把元素都罗列出来

时间复杂度:O(logN+M)

7.zpopmax

删除分数最好的元素,返回值是被删除的元素加分数

如果存在多个元素分数相同,就会按照字典序来删

这个命令的时间复杂度是O(logN)

此处删除最大值,就相当于是尾删,既然是尾删,那为啥不把最后一个元素的位置记录下来,使得时间复杂度变成O(1)呢?其实是可以的,但是redis没有采取这个做法,而是直接调用了通用的删除函数

8.bzpopmax

这是阻塞版本的。咱们这里的有序集合,也可以视为优先级队列,有时也需要一个带有阻塞功能的优先级队列。

和list中的blpop brpop用法一样

如上,返回值就是集合名字+member+分数

时间复杂度:O(logN)

如果此时bzpopmax同时监听了多个key,假设是M个,那时间复杂度会不会是M*logN?不是,因为它是删除最先执行命令的客户端的key

9.zpopmin bzpopmin

和max的用法一致

10.zrank zrevrank

zrank/zrevrank key member 得到member的排名

时间复杂度O(N),最主要是有个查询位置的过程

这俩个的区别就是,一个是从前往后遍历(升序),一个是从后往前遍历

11.zrem

一次删除一个或多个成员

时间复杂度:O(M+logN) N是有序集合中元素都个数,M是stop-start的元素个数

12.zremrangebyscore

zremrangebyscore key min max

删除指定分数范围内的元素,时间复杂度:O(M+logN)

同样,默认是闭区间,如果想让他是开区间那就加上左括号!!!

13.zincrby

zincrby key increment member 给元素加分数

14.zinter zinterstore

zinter是从redis6.0开始支持的,这里先不讲

先看zinterstore

zinterstore destination numkeys key [key……] [weights weight [weight……]]

destination描述了将交集放到哪个集合,numkeys描述了后面几个集合在求交集,weights后面是每一个集合的权重/占比(就是相当于一个系数,会乘以当前的分数)

如上,就是说z1占2份,z2占3份,分数相乘再相加即可

时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数 N和M很相近,K一般很小可以看成1,所以化简一下就是O(M*logM)

15.zunion zunionstore

和zinterstore用法一致

三.内部编码

1.ziplist:如果内部元素个数少,或者单个元素体积小,就是用ziplist存储。指标是zset-max-ziplist-entries和zset-max-ziplist-value

2.skiplist:如果元素个数多,或者单个元素体积大,就是用跳表。跳表是一个复杂的链表。

四.应用场景

1.排行榜系统

微博热榜,游戏天梯排行,成绩排行……

关键是,用来排行的分数是不断变化的,虽然是实时变化的,但也能够高效率的更新排行

游戏排行榜算是简单的引用,还有一些排行榜就有一点复杂,比如微博热度:1.浏览量2.点赞量3.转发量4.评论量……  根据每一个维度计算到综合得分,就是微博的热度。此时就可以借助zinterstore/zunionstore来按照加权的方式处理了。

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

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

相关文章

Spark MLlib实践指南:从大数据推荐系统到客户流失预测的全流程建模

问题一 背景: 本题目基于用户数据,将据数据切分为训练集和验证集,供建模使用。训练集与测试集切分比例为8:2。 数据说明: capter5_2ml.csv中每列数据分别为userId , movieId , rating , timestamp。 数据: capte…

jboss

一。CVE-2015-7501 1.POC,访问地址 192.168.10.193:8080/invoker/JMXInvokerServlet 返回如下,说明接⼝开放,此接⼝存在反序列化漏洞 2.下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码…

828华为云征文 | 使用Flexus X实例搭建Dubbo-Admin服务

一、Flexus X实例简介 华为云推出的Flexus云服务,作为专为中小企业及开发者设计的新一代云服务产品,以其开箱即用、体验卓越及高性价比而著称。其中的Flexus云服务器X实例,更是针对柔性算力需求量身打造,能够智能适应业务负载变化…

msvcp100.dll丢失怎样修复,总共有6种修复方法

在现代的数字化生活中,电脑已经成为我们工作、学习和娱乐的重要工具。然而,由于各种原因,电脑可能会出现各种问题,其中最常见的就是一些系统文件丢失或损坏。最近,有用户反映他们的电脑出现了“msvcp100.dll丢失”的问…

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期] 第七期介绍:事件订阅之WebSocket方式 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期]第七期介绍:事件订阅之WebSocket方式 WebSocket方式通用数据结构 Payload长连接维护 O…

LLMs之LCM:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读

LLMs之LCM:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读 导读:MemLong 是一种新颖高效的解决 LLM 长文本处理难题的方法,它通过外部检索器获取历史信息,并将其与模型的内部检索过程相结合&#xff…

Linux C高级day3

一、思维导图 二、练习 #!/bin/bash mkdir ~/dir mkdir ~/dir/dir1 mkdir ~/dir/dir2 cp -r * ~/dir/dir1/ cp -r *.sh ~/dir/dir2/ cd ~/dir/dir2/ tar -cvJf dir2.tar.xz dir2 mv dir2.tar.xz ~/dir/dir1/ cd ~/dir/dir1 tar -xvJf dir2.tar.xz #!/bin/bash head -5 /etc/gr…

高版本JMX Console未授权

1.环境搭建 cd vulhub-master/jboss/CVE-2017-12149 docker-compose up -d 2.访问漏洞地址 nullhttp://47.121.211.205:8080/jmx-console/ 3.远程下载war包 输入远程war包的地址 http://47.121.211.205/shell.war 4.访问上传文件并进行连接 访问上传文件 使用工具进行连…

Jboss 靶场攻略

CVE-2015-7501 步骤一:环境搭建 cd vulhub/jboss/JMXInvokerServlet-deserialization docker-compose up -d docker ps 步骤二:POC,访问地址 http://192.168.10.190:8080/invoker/JMXInvokerServlet 返回如下,说明接⼝开放&…

【Linux进程】进程退出

目录 前言 1. 进程退出的几种情况 2. 进程常见的退出方式 3. 退出码与错误码 4. 进程异常 5. exit与_exit 6. 进程等待 wait与waitpid 获取子进程status 非阻塞等待 前言 进程执行结束退出,就必然需要进行资源回收,子进程由父进程回收&#xff0c…

LampSecurityCTF4 靶机渗透 ( sqlmap ,ssh 参数调整 )

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testLampSecurityCTF4] └─$ sudo nmap -sn 192.168.50.0/24 [sudo] password for kali: Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-22 10:30 CST Nmap scan report for 192…

自闭症孩子送寄宿学校,给他们成长的机会

在自闭症儿童的教育与康复之路上,选择一种合适的寄宿方式对于孩子的成长至关重要。这不仅关乎到孩子能否获得专业的训练与关怀,还直接影响到他们未来的社交能力、独立生活能力以及心理健康。今天,我们将以广州的星贝育园自闭症儿童寄宿制学校…

【VUE3.0】动手做一套像素风的前端UI组件库---Radio

目录 引言做之前先仔细看看UI设计稿解读一下都有哪些元素:参考下成熟的组件库,看看还需要做什么? 代码编写1. 设计group包裹选项的组件group.vueitem.vue 2. 让group的v-model和item的value联动起来3. 完善一下item的指示器样式4. 补充禁用模…

MAE 模型

masked autoencoders (MAE) 论文地址:https://arxiv.org/abs/2111.06377 代码地址:https://github.com/facebookresearch/mae 模型结构图: 思想:自监督学习(Self-Supervised Learning),遮住大部分&…

机器学习(1)sklearn的介绍和六个主要模块、估计器、模型持久化

文章目录 1.sklearn介绍2.sklearn的模块3.监督学习和无监督学习1. 监督学习 (Supervised Learning)例子 2. 无监督学习 (Unsupervised Learning)例子 4.估计器估计器的主要特性和方法包括:估计器的类型:示例:使用 scikit-learn 中的估计器 5.…

恶意windows程序

Lab07-01.exe分析(DOS攻击) 1.当计算机重启后,这个程序如何确保它继续运行(达到持久化驻留)? 创建Malservice服务实现持久化 先分析sub_401040桉函数 尝试获取名为HGL345互斥量句柄,如果不存在则直接结束流程;如果存…

Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料

选择123云盘作为存储介质的原因 原因1: zotero个人免费空间大小:300M,如果zotero云端也保存文献pdf资料则远远不够 原因2: 百度网盘同步文件空间大小:1G123云盘同步文件空间大小:10G 第一台电脑实施步骤…

23章 排序

1.编写程序&#xff0c;分别使用Comparable和Comparator接口对元素冒泡排序。 import java.util.Comparator;public class MySort {public static <E extends Comparable<E>> void bubbleSort(E[] list) {boolean needNextPass true;for (int i 1; needNextPass…

困扰霍金和蔡磊等人的渐冻症,能否在医学AI领域寻找到下一个解决方案?|个人观点·24-09-22

小罗碎碎念 前沿探索&#xff1a;医学AI在渐冻症&#xff08;Amyotrophic Lateral Sclerosis&#xff0c;ALS&#xff09;领域的研究进展 老粉都知道&#xff0c;小罗是研究肿瘤的&#xff0c;之前的推文也几乎都是探索医学AI在肿瘤领域的研究进展。 在查阅资料的时候&#xf…

跟着问题学12——GRU详解

1 GRU 1. 什么是GRU GRU&#xff08;Gate Recurrent Unit&#xff09;是循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;的一种。和LSTM&#xff08;Long-Short Term Memory&#xff09;一样&#xff0c;也是为了解决长期记忆 和反向传播中的梯度等问题…