当前位置: 首页 > news >正文

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的加权方式来处理了.

相关文章:

Redis中的Zset类型

目录 Zset的相关命令 zadd zrange zcard zcount zrevrange zrangebyscore zpopmax bzpopmax zpopmin和bzpopmin zrank zrevrank zscore zrem zremrangebyrank zremrangebyscore 操作集合间的命令 zinterstore和zunionstore 内部编码 Zset的应用场景 Zset表…...

Python行对齐工具difflib

1 用途 1.1 功能 对比两个字符串数组之间的差异,以第一个参数为基准,与第二个参数比较。 1.2 使用场景 一个原文件,一个改过的文件,对比差异;一个纯文本,一个带格式的,对比差异;…...

Flutter利用GridView创建网格布局实现优美布局

文章目录 简介使用详解导入依赖项创建一个基本的 GridView一些参数说明使用GridView.count来构造 其他控制总结 简介 GridView 是 Flutter 中用于创建网格布局的强大小部件。它允许你在行和列中排列子小部件,非常适合显示大量项目,例如图像、文本、卡片…...

IDEA 基本配置

IDEA 基本配置 1、基本样式2、环境参数3、基本插件4、参考 1、基本样式 设置全局字体大小 配置font 字体大小:15 配置类注释 /** ** Author: ${USER}* Date: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}* Version: 1.0.0 */配置注释keymap 添加 注释 ccm&…...

计算机组成原理平时作业一

计算机组成原理平时作业一 1.单选题 1.1计算机中使用总线结构便于增减外设,同时(c )。 a.减少了信息传输量 b.提高了信息传输量 c.减少了信息传输量的条数 d.三者均正确 答案解析: 概念规定 1.2在定点补码运算器中,…...

iOS Crash 治理:淘宝VisionKitCore 问题修复

本文通过逆向系统&#xff0c;阅读汇编指令&#xff0c;逐步找到源码&#xff0c;定位到了 iOS 16.0.<iOS 16.2 WKWebView 的系统bug 。同时苹果已经在新版本修复了 Bug&#xff0c;对于巨大的存量用户&#xff0c;仍旧会造成日均 Crash pv 1200 uv 1000&#xff0c; 最终通…...

NSSM部署window服务

nssm 下载 安装服务&#xff1a;nssm install <servicename> 启动服务&#xff1a;nssm start <servicename> 停止服务&#xff1a;nssm stop <servicename> 重启服务: nssm restart <servicename> 删除创建的servername服务: nssm remove <service…...

Go语言数据类型

文章目录 Go语言数据类型一、布尔类型二、数字类型三、字符串类型四、派生类型 Go语言数据类型 在 Go 编程语言中&#xff0c;数据类型用于声明函数和变量。 数据类型的出现是为了把数据分成所需内存大小不同的数据&#xff0c;编程的时候需要用大数据的时候才需要申请大内存…...

Python爬取汽车之家二手车数据并作可视化

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 课程亮点: 1、系统分析目标网页 2、html标签数据解析方法 3、海量数据一键保存 获取二手车数据 环境介绍: python 3.8 pycharm 2022.3专业版 requests >>>…...

NeRF神经辐射场渲染过程详解,三维重建渲染过程基本原理_光线采样sample_pdf()和光线渲染render_rays ()代码详解

目录 1 神经辐射场 1.1 基本原理 1.2 基本流程 1.3 数学解释 2 三维场景图像渲染详解 2.1射线采样 2.2 NeRF 模型预测 2.3 体积渲染 3 采样与渲染代码详解 &#xff08;rending.py&#xff09; 3.1 神经体积渲染代码解析 3.2 sample_pdf 函数 3.3 render_rays 函数 …...

Msa类处理多序列比对数据

同源搜索&#xff0c;多序列比对等都是常用的方式&#xff0c;但是有很多的软件可以实现这些同源搜索和多序列比对&#xff0c;但是不同的软件输出的文件格式却是不完全一致&#xff0c;有熟悉的FASTA格式的&#xff0c;也有A2M, A3M,stockholm等格式。 详细介绍&#xff1a; …...

ChatGPT如何管理对话历史?

问题 由于现在开始大量使用ChatGPT对话功能&#xff0c;认识到他在提供启发方面具有一定价值。比如昨天我问他关于一个微习惯的想法&#xff0c;回答的内容还是很实在&#xff0c;而且能够通过他的表达理解自己的问题涉及到的领域是什么。 此外&#xff0c;ChatGPT能够总结对话…...

独立键盘接口设计(Keil+Proteus)

前言 软件的操作参考这篇博客。 LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff09;-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/134101256?spm1001.2014.3001.5501实验&#xff1a;用4个独立按键控制8个LED指示灯。 按下k1键&#x…...

阿里云99元服务器2核2G3M带宽_4年396元_新老用户同享

阿里云99元服务器新老用户同享活动 aliyunfuwuqi.com/go/aliyun 首先要在2023年11月1日去阿里云活动页下单新购这个套餐&#xff0c;享受99元包1年。同天再续费1年又享受了99元包1年&#xff1b;等到明年2024年11月1日之后&#xff0c;又可以以99元续1年&#xff1b;最后等到20…...

数据库实验:SQL的数据控制

目录 数据控制实验目的实验内容实验要求实验过程实验内容提纲实验过程 数据控制 数据控制SQL语句(DCL)是一类可对用户数据访问权进行控制的操作语句&#xff0c;可以控制特定用户或角色对数据表、视图、存储过程、触发器等数据对象的访问权限。主要有GRANT、REVOKE、DENY语句操…...

深度学习_10_softmax_实战

由于网上代码的画图功能是基于jupyter记事本&#xff0c;而我用的是pycham,这导致画图代码不兼容pycharm,所以删去部分代码&#xff0c;以便能更好的在pycharm上运行 完整代码&#xff1a; import torch from d2l import torch as d2l"创建训练集&创建检测集合"…...

基于SpringBoot+Vue的博物馆管理系统

基于springbootvue的博物馆信息管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 用户界面 摘要 基于SpringBoot和Vue的博物馆…...

软件开发中常见的设计原则

软件开发中常见的设计原则 1. 单一责任原则2. 开放封闭原则3. 里氏替换原则4. 接口分离原则5. 依赖倒置原则6. 迪米特法则7. 合成复用原则8. 共同封闭原则9. 稳定抽象原则10. 稳定依赖原则 简写全拼中文翻译SRPThe Single Responsibility Principle单一责任原则OCPThe Open Clo…...

Linux安装ffmpeg并截取图片和视频的缩略图使用

Linux安装ffmpeg并截取图片和视频的缩略图使用 官方下载地址: http://www.ffmpeg.org/download.html#releases 我这里使用版本: ffmpeg_3.2_repo.tar.gz 可以百度网盘分享给大家 安装的环境为 Centos 64位操作系统 安装时须为 root 用户进行操作 #解压 tar -zxvf ffmpeg_3…...

第三章:人工智能深度学习教程-基础神经网络(第一节-ANN 和 BNN 的区别)

你有没有想过建造大脑之类的东西是什么感觉&#xff0c;这些东西是如何工作的&#xff0c;或者它们的作用是什么&#xff1f;让我们看看节点如何与神经元通信&#xff0c;以及人工神经网络和生物神经网络之间有什么区别。 1.人工神经网络&#xff1a;人工神经网络&#xff08;…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...