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…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...

Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...