redis:zset有序集合命令和内部编码
个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》《C++》《Linux》《网络》 《redis学习笔记》
文章目录
- 前言
- 命令
- ZADD
- ZRANGE
- ZREVRANGE
- ZCARD
- ZCOUNT
- ZPOPMAX
- BZPOPMAX
- ZPOPMIN
- BZPOPMIN
- ZRANK
- ZSCORE
- ZREM
- ZREMRANGEBYRANK
- ZREMRANGEBYSCORE
- ZINCRBY
- 集合间操作
- ZINTERSTORE
- ZUNIONSTORE
- 内部编码
- 总结
前言
有序集合(zset)是redis提供的一种特殊集合类型,结合了集合(元素不能重复)和有序链表(元素有序)的特性;在有序集合中,每一个元素(member)都关联着一个分数(score),这个分数是双精度浮点数,用于对元素进行排序(按照升序的方式进行排列)。
注意:元素不能重复,但分数可以重复;相同分数的元素按照字典序排序
有序集合提供了获取指定分数和元素范围查找,计算成员排名等功能。
命令
ZADD
添加或者更新指定的元素以及关联的分数到zset中,分数应该符合 double 类型,+inf/-inf(正无穷/负无穷)作为正负极限也是合法的
ZADD key [NX | XX] [CH] [INCR] score member [score member … ]
返回值:本次添加成功的元素个数
时间复杂度:O(logN),由于zset是有序结构,要求新增的元素,要放到合适的位置上(需要遍历),而zset内部的数据结构主要是跳表
ZADD相关选项:
- NX:仅在成员不存在时才添加;如果指定的成员已经存在于有序集合中,则不会执行添加操作,并且命令会返回0;可以用于确保集合中成员的唯一性
- XX:仅在成员已经存在时才更新;如果指定的成员不存在与有序集合中,则不会执行任何操作;如果成员存在,则更新其分数
- CH:返回发送变化的成员数量;当使用该选项时,ZADD命令会返回成功添加和更新的成员数量
- INCR:对成员的分数进行增加;指定成员已经存在,则将其分数增加指定的增量值;如果成员不存在,则将其添加到集合中,并以增量值作为起始分数。
添加 CH 选项
添加 XX 选项
添加 NX 选项
添加 INCR选项
ZRANGE
返回指定区间里的元素,分数按照升序排列;带上 WITHSCORES可以把分数返回
ZRANGE key start stop [WITHSCORES]
此处 [start, stop] 为下表构成的区间;有序集合,本身元素就是有先后顺序的,明确区分谁在前,谁在后,因此可以给这个有序集合赋予下标
返回值:区间内的元素列表
时间复杂度:O(logN + M),logN为查找到下标 start 元素的时间消耗,M 是遍历区间的时间消耗
注意:
如果修改的分数,影响到之前的顺序,就会自动的移动元素位置,保持原有的升序顺序不变
ZREVRANGE
返回指定区间里的元素,分数按照降序排列;带上 WITHSCORES可以把分数返回
ZREVRANGE key start stop [WITHSCORES]
返回值:区间内的元素列表
时间复杂度:O(logN + M)
ZCARD
获取一个zset的基数(cardinality),即zset中的元素个数
ZCARD key
返回值:zset内的元素个数
时间复杂度:O(1)
ZCOUNT
返回分数在 min 和 max 之间的元素个数,默认情况下是闭区间,可以通过 “(” 来排除边界
ZCOUNT key min max
返回值:满足条件的元素列表个数
时间复杂度:O(logN);实际上,zset内部会记录每个元素当前的次序;查询到元素(logN),这样直接知道元素所在的次序,可以直接把max对应的元素次序和min对应的元素次序,做减法知道满足条件的元素个数。
ZPOPMAX
删除并返回分数最高的 count 个元素,count默认为一个
ZPOOPMAX key [count]
返回值:被删除的分数和元素列表
时间复杂度:O(logN * M),logN为查询最大值元素,M为删除元素个数
注意:在有序集合中(升序),最大值相当于最后一个元素,删除最大值就是尾删
BZPOPMAX
删除并返回分数最高的元素;如果指定的有序集合为空,该命令阻塞,直到有元素被添加到集合中或者超时发送
BZPOPMAX key [key …] timeout
返回值:被删除的分数和元素列表
时间复杂度:O(logN),logN为查询最大值元素
在阻塞行为上zset的阻塞命令与list阻塞命令相似。
ZPOPMIN
删除并返回分数最低的count个元素
ZPOPMIN key [count]
返回值:删除的分数和元素列表
时间复杂度:O(logN * M),logN为查找分数最低的元素,M为删除元素的个数
注意:在有序集合中(升序),最小值相当于第一个元素,删除最小值就是头删
BZPOPMIN
删除并返回分数最低的元素;如果指定的有序集合为空,该命令阻塞,直到有元素被添加到集合中或者超时发送
BZPOPMIN key [key …] timeout
返回值:删除的分数和元素列表
时间复杂度:O(logN),logN为查找分数最低的元素
ZRANK
返回指定元素的排名,按照升序
ZRANK key member
返回值:指定元素的排名
时间复杂度:O(logN),logN为查找指定元素
ZSCORE
返回指定元素的分数
ZSCORE key member
返回值:指定元素的分数
时间复杂度:O(1),执行ZSCORE命令时,redis首先使用哈希表来快速定位到指定的元素,然后直接从哈希表中获取与该元素关联的分数。
注意:
zset有序集合是通过哈希表和跳表来实现的,哈希表用于快速查找元素是否存在,而跳表则用于维护元素的有序性并支持范围查询
ZREM
删除指定的元素
ZREM key member [member …]
返回值:本次操作删除的元素个数
时间复杂度:O(MlogN),M为参数中member的个数,N为整个有序集合元素的个数
ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,闭区间
ZREMRANGEBYRANK key start stop
返回值:本次操作删除的元素个数
时间复杂度:O(logN + M),N为整个有序集合的元素个数,M是|start - stop|区间的元素个数,只需要查找一次位置即可
ZREMRANGEBYSCORE
按照分数删除指定范围的元素,闭区间
ZREMRANGEBYSCORE key min max
返回值:本次操作删除的元素个数
时间复杂度:O(logN + M)
"("表示排除边界值
ZINCRBY
为指定的元素的关联分数添加指定的分数值
ZINCRBY key increment member
返回值:增加后元素的分数
时间复杂度:O(logN),logN为查找指定元素
ZINCRBY不仅会修改分数内容,也能同时移动元素位置,保持整个有序集合的有序
集合间操作
ZINTERSTORE
求出给定有序集合中元素的交集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,远山对应的分数按照不同的聚合方式和权重等到新的分数
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE <SUM | MIN | MAX>]
返回值:目标集合中的元素个数
时间复杂度:O(N * K) + O(M * logM),N是输入的有序集合中,最小的有序集合的元素个数;K是输入了几个有序集合;M是最终结果的有序集合的元素个数
- destination 有序集合的键名,用于存储交集操作的结果;如果指定的键已存在,会被覆盖
- numkeys 一个整数,表示接下来要指定的有序集合键(key) 的数量
- [WEIGHTS weight [weight]] 允许为每个输入有序集合的成员指定一个权重,这些权重在计算交集成员的分数时使用,权重默认为1;权重的数量必须与输入集合的数量相匹配
- [AGGREGATE <SUM | MIN | MAX>] 当输入有序集合的成员在交集操作中有相同的元素时,旋转如何处理这些成员的分数;SUM将具有相同元素的成员的分数相加(默认行为),MIN使用相同元素的成员中的最小分数,MAX使用相同元素的成员中最大分数
两个有序集合user:ranking:1 和 user:ranking:2
使用SUM处理相同元素的分数
使用MAX处理相同元素的分数
使用MIN处理相同元素的分数
给user:ranking:1指定的权重为0.5,user:ranking:2指定的权重为2,使用SUM处理相同元素的分数
ZUNIONSTORE
求出给定有序集合中元素的并集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照聚合方式和权重等到新的分数
ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE <SUM | MIN | MAX>]
返回值:目标集合中的元素个数
时间复杂度:O(N) + O(MkogM) N是输入有序集合总的元素个数,M是最终结果的有序集合的元素个数
选项与ZINTERSTORE一样
给user:ranking:1指定的权重为2,user:ranking:2指定的权重为3,使用SUM处理相同元素的分数
内部编码
有序集合类型的内部编码有两种:
- ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置,同时每个元素的值都小于zset-max-ziplist-value配置时,redis会使用ziplist作为有序集合的内部实现
- skiplist(跳表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现
总的来说就是,如果有序集合的元素个数较少,或者单个元素体积较小,使用ziplist来存储;如果有序集合的元素个数比较多,或者单个元素体积非常大,使用skiplist来存储
总结
以上就是我的redis学习笔记
相关文章:

redis:zset有序集合命令和内部编码
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令ZADDZRANGEZREVRANGEZCARDZCOUNTZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY集合间操作…...

Day107:代码审计-PHP模型开发篇MVC层RCE执行文件对比法1day分析0day验证
知识点: 1、PHP审计-MVC开发-RCE&代码执行 2、PHP审计-MVC开发-RCE&命令执行 3、PHP审计-MVC开发-RCE&文件对比 MVC 架构 MVC流程: Controller截获用户发出的请求;Controller调用Model完成状态的读写操作;Contr…...

Web服务nginx实验1访问特定目录
启动服务: 创建haha目录,并且在里面创建index.html文件,往里面写东西: 让客户端访问haha目录:(默认只会读取里面的index.html文件) 目录后面加/显示的是内容,不加则是代码࿱…...

数据结构之二叉树前序,中序,后序习题分析(递归图)
1.比较相同的树 二叉树不能轻易用断言,因为树一定有空 2.找结点值 3.单值二叉树 4.对称二叉树 5.前序遍历...

Me-LLaMA——用于医疗领域的新型开源大规模语言模型
摘要 大规模语言模型的出现是提高病人护理质量和临床操作效率的一个重大突破。大规模语言模型拥有数百亿个参数,通过海量文本数据训练而成,能够生成类似人类的反应并执行复杂的任务。这在改进临床文档、提高诊断准确性和管理病人护理方面显示出巨大的潜…...

C#-常见异常的处理方式(持续更新)
1、从网络位置加载程序集失败,默认不启用CAS策略 错误原因:使用 Assembly.LoadFile(dllPath) 加载外部Dll时,DotNET安全机制阻止加载一个本地网或互联网上的程序集。 解决方案: ①配置app.config文件,在runtime节点…...

「Mac玩转仓颉内测版2」入门篇2 - 编写第一个Cangjie程序
本篇详细介绍在Mac系统上创建首个Cangjie项目并编写、运行第一个Cangjie程序的全过程。内容涵盖项目创建、代码编写、程序运行与调试,以及代码修改后的重新运行。通过本篇,掌握Cangjie项目的基本操作,进一步巩固开发环境的配置,迈…...

注册登录学生管理系统小项目
头文件 #ifndef _LOGINLINK_H_ #define _LOGINLINK_H_ #include<myhead.h> typedef struct {int id;char name[20];int age; }stu,*Pstu; typedef struct node {union{int len;stu data;};struct node *next; }node,*Pnode; int regist(); int login(); Pnode create()…...

qt QCompleter详解
1、概述 QCompleter是Qt框架中的一个类,用于为文本输入提供自动完成功能。它可以与Qt的输入控件(如QLineEdit、QTextEdit等)结合使用,根据用户的输入实时过滤数据源,并在输入控件下方或内部显示补全建议列表。用户可以…...

YOLOv11融合特征细化前馈网络 FRFN[CVPR2024]及相关改进思路
YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 一、 模块介绍 论文链接:Adapt or Rerish 代码链接:https://github.com/joshyZhou/AST 论文速览:基于 transformer 的方法在图像恢复任务中取得了有希望的性能,因为…...
【前端知识】JS模块规范
JS模块规范 概述CommonJS 规范 代码示例AMD 规范 代码示例ES6 Module 规范 代码示例IIFE 规范 代码示例全局变量 代码示例 CommonJS 模块和 ES6 模块有什么区别?1. 语法和声明方式2. 动态和静态导入3. 循环依赖4. 默认导出和命名导出5. 文件扩展名6. 环境和应用7. 工…...
vue3展示pag格式动态图
提示:如果是webpack环境的,参考:Pag格式在vue3中的简单使用方法_pag文件-CSDN博客 下面展示的是在vite环境下配置pag 1、安装libpag npm i libpag --save 2、安装rollup-plugin-copy npm i rollup-plugin-copy --save 3、封装pag组件 下…...
代码随想录算法训练营第三十九天|Day39 动态规划
198.打家劫舍 视频讲解:https://www.bilibili.com/video/BV1Te411N7SX https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html 思路 #define max(a, b) ((a) > (b) ? (a) : (b)) int rob(int* nums, int numsSize) {if(numsSize 0){ret…...

qt QMovie详解
1、概述 QMovie 是 Qt 框架中用于处理动画文件的类。它支持多种动画格式,包括 GIF 和一些常见的视频格式(尽管对视频格式的支持依赖于底层平台)。QMovie 类主要用于在 QLabel 或 QGraphicsView 等控件中显示动画。通过加载动画文件ÿ…...
数据集整理
系列博客目录 文章目录 系列博客目录1.Visual Genome数据集2.COCO数据集3.Flickr30k数据集10.集合多个数据集的网站 1.Visual Genome数据集 官网链接:https://homes.cs.washington.edu/~ranjay/visualgenome/index.html Visual Genome数据集梳理 Visual Genome数据…...

认证授权基础概念详解
目录 认证 (Authentication) 和授权 (Authorization)的区别是什么? RBAC 模型了解吗? 什么是 Cookie ? Cookie 的作用是什么? 如何在项目中使用 Cookie 呢? 如何在 Spring Boot 中创建和读取 Cookie 创建 Cookie Cookie 到期日期 安全…...
美国地址生成器站点
推荐一:fakexy 官网地址:https://www.fakexy.com 推荐二:好维持官网地址: https://www.dizhishengcheng.com 官网除了支持生成美国地址信息外,还支持生成英国、加拿大、日朩、澳大利亚、德国、法国、意大利、西班牙、巴…...

微信4.0大版本升级跨平台支持界面全面改版
微信4.0公测版现已正式发布,作为微信的大版本升级,新版微信基于全新架构开发,跨平台支持Windows和MAC系统,界面也全面改版,聊天宝也第一时间适配微信4.0,为广大客户提供快捷回复支持 前言 微信4.0公测版现…...

不想贴秋膘?正确打开秋冬运动姿势
这个秋天想要轻装上阵,想健康入秋更要美美入冬怎么破?这期把正确打开秋冬姿势一次性告诉你哦~ 天气变凉,脂肪可要燃起来~想要无痛入秋,最重要的动起来!每天都抽出一点时间去运动一下,不光让身体燃起来&…...
【AIGC半月报】AIGC大模型启元:2024.11(上)
【AIGC半月报】AIGC大模型启元:2024.11(上) (1) Hunyuan-Large(腾讯开源大模型)(2) FLUX1.1 pro(文生图)(3) CogVideoX v1.5(智谱AI升级文生视频大模型) (1) Hunyuan-Lar…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...