[Redis][Zset]详细讲解

目录

  • 0.前言
  • 1.常见命令
    • 1.ZADD
    • 2.ZCARD
    • 3.ZCOUNT
    • 4.ZRANGE
    • 5.ZREVRANGE
    • 6.ZRANGEBYSCORE
    • 7.ZPOPMAX
    • 8.BZPOPMAX
    • 9.ZPOPMIN
    • 10.BZPOPMIN
    • 11.ZRANK
    • 12.ZREVRANK
    • 13.ZSCORE
    • 14.ZREM
    • 15.ZREMRANGEBYRANK
    • 16.ZREMRANGEBYSCORE
    • 17.ZINCRBY
  • 2.集合间操作
    • 1.有序集合的交集操作
    • 2.ZINTERSTORE
    • 3.有序集合的并集操作
    • 4.ZUNIONSTORE
  • 3.内部编码
    • 1.ziplist(压缩链表)
    • 2.skiplist(跳表)
  • 4.使用场景


0.前言

  • 它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,这使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数

    • 注意
      • zset内部是按照升序方式来排列的
      • 如果score相同,则按照元素自身字符串的字典序来排列
        请添加图片描述
  • 有序集合提供了获取指定分数和元素范围查找、计算成员排名等功能,合理地利⽤有序集合,可 以帮助在实际开发中解决很多问题

    • 对于ZSET来说,既可以通过member找到对应的score,也可以通过score找到匹配的member
  • 有序集合中的元素是不能重复的,但分数允许重复
    请添加图片描述


1.常见命令

1.ZADD

  • 功能添加或者更新指定的元素以及关联的分数到zset中,分数应该符合double类型,+inf/-inf作为正负极限也是合法的
  • 语法ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
  • 相关选项
    • XX:仅仅用于更新已经存在的元素,不会添加新元素
    • NX:仅用于添加新元素,不会更新已经存在的元素
    • LT:新score小于当前score,则更新
    • GT:新score大于当前score,则更新
    • CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数
    • INCR:此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定一个元素和分数
  • 返回值:本次添加成功的元素个数
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

2.ZCARD

  • 功能:获取一个zset的计数(cardinality),即zset中的元素个数
  • 语法ZCARD key
  • 返回值zset内的元素个数
  • 时间复杂度 O ( 1 ) O(1) O(1)

3.ZCOUNT

  • 功能:返回分数在minmax之间的元素个数
    • 默认情况下,minmax都是包含的,可以通过(排除 -> 表示开区间
    • 左右区间都只能用(排除,而不是左区间用(,右区间用)
  • 语法ZCOUNT key min max
  • 返回值:满足条件的元素列表个数
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

4.ZRANGE

  • 功能:返回指定区间⾥的元素,分数按照升序,带上WITHSCORES可以把分数也返回
  • 语法ZRANGE key start stop [WITHSCORES]
  • 返回值:区间内的元素列表
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

5.ZREVRANGE

  • 功能:返回指定区间⾥的元素,分数按照降序,带上WITHSCORES可以把分数也返回
    • 注意:这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE
  • 语法ZREVRANGE key start stop [WITHSCORES]
  • 返回值:区间内的元素列表
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

6.ZRANGEBYSCORE

  • 功能:返回分数在minmax之间的元素,默认情况下,minmax都是包含的,可以通过(排除
    • 注意:这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE
  • 语法ZRANGEBYSCORE key min max [WITHSCORES]
  • 返回值:区间内的元素列表
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

7.ZPOPMAX

  • 功能:删除并返回分数最高的count个元素
  • 语法ZPOPMAX key [count]
  • 返回值:分数和元素列表
  • 时间复杂度 O ( l o g ( N ) ∗ M ) O(log(N) * M) O(log(N)M)

8.BZPOPMAX

  • 功能ZPOPMAX的阻塞版本
  • 语法BZPOPMAX key [key ...] timeout
    • timeout:单位为秒,支持浮点数
  • 返回值:元素列表
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

9.ZPOPMIN

  • 功能:删除并返回分数最低的count个元素
  • 语法ZPOPMIN key [count]
  • 返回值:分数和元素列表
  • 时间复杂度 O ( l o g ( N ) ∗ M ) O(log(N) * M) O(log(N)M)

10.BZPOPMIN

  • 功能ZPOPMIN的阻塞版本
  • 语法BZPOPMIN key [key ...] timeout
  • 返回值:元素列表
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

11.ZRANK

  • 功能:返回指定元素的排名,升序
  • 语法ZRANK key member
  • 返回值:排名
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

12.ZREVRANK

  • 功能:返回指定元素的排名,降序
  • 语法ZREVRANK key member
  • 返回值:排名
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

13.ZSCORE

  • 功能:返回指定元素的分数
  • 语法ZSCORE key member
  • 返回值:分数
  • 时间复杂度 O ( 1 ) O(1) O(1)

14.ZREM

  • 功能:删除指定元素
  • 语法ZREM key member [member ...]
  • 返回值:本次操作删除的元素个数
  • 时间复杂度 O ( l o g ( N ) ∗ M ) O(log(N) * M) O(log(N)M)

15.ZREMRANGEBYRANK

  • 功能:按照排序,升序删除指定范围的元素,左闭右闭
  • 语法ZREMRANGEBYRANK key start stop
  • 返回值:本次操作删除的元素个数
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

16.ZREMRANGEBYSCORE

  • 功能:按照分数删除指定范围的元素,左闭右闭
  • 语法ZREMRANGEBYSCORE key min max
  • 返回值:本次操作删除的元素个数
  • 时间复杂度 O ( l o g ( N ) + M ) O(log(N) + M) O(log(N)+M)

17.ZINCRBY

  • 功能:为指定的元素的关联分数添加指定的分数值
  • 语法ZINCRBY key increment member
  • 返回值:增加后元素的分数
  • 时间复杂度 O ( l o g ( N ) ) O(log(N)) O(log(N))

2.集合间操作

1.有序集合的交集操作

请添加图片描述


2.ZINTERSTORE

  • 功能:求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数
  • 语法ZINTERSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE]
    • 注意numkeys必须准确填写,以便后面将参数准确解析
  • 返回值:⽬标集合中的元素个数
  • 时间复杂度 O ( N ∗ K ) + O ( M ∗ l o g ( M ) ) O(N*K)+O(M*log(M)) O(NK)+O(Mlog(M)),N是输⼊的有序集合中最⼩的有序集合的元素个数,K是输⼊了 ⼏个有序集合,M是最终结果的有序集合的元素个数

3.有序集合的并集操作

请添加图片描述


4.ZUNIONSTORE

  • 功能:求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数
  • 语法ZUNIONSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE ]
  • 返回值:目标集合中的元素个数
  • 时间复杂度 O ( N ) + O ( M ∗ l o g ( M ) ) O(N)+O(M*log(M)) O(N)+O(Mlog(M)),N是输⼊的有序集合总的元素个数,M是最终结果的有序集合的元素个数

3.内部编码

1.ziplist(压缩链表)

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

2.skiplist(跳表)

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

4.使用场景

  • 有序集合⽐较典型的使⽤场景就是排⾏榜系统
    • 例如:常⻅的⽹站上的热榜信息,榜单的维度可能是多⽅⾯的:按照时间、按照阅读量、按照点赞量
  • 示例:凭借点赞数,维护每天的热榜
    • 添加用户点赞数
      # ⽤⼾james发布了⼀篇⽂章,并获得3个赞,可以使⽤有序集合的zadd和zincrby功能
      zadd user:ranking:2024-09-01 3 james# 之后如果再获得赞,可以使⽤zincrby
      zincrby user:ranking:2022-03-15 1 james
      
    • 取消用户点赞数
      # 由于各种原因需要将⽤⼾删除,此时需要将⽤⼾从榜单中删除掉,可以使⽤zrem
      zrem user:ranking:2024-09-01 tom
      
    • 展示获取赞数最多的10个用户
      zrevrangebyrank user:ranking:2024-09-01 0 9
      
    • 展示用户信息以及用户分数:次功能将⽤⼾名作为键后缀,将⽤⼾信息保存在哈希类型中,⾄于⽤⼾的分数和排名可以使⽤zscorezrank来实现
      hgetall user:info:tom
      zscore user:ranking:2022-03-15 mike
      zrank user:ranking:2022-03-15 mike
      

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

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

相关文章

网络战时代的端点安全演变

​ 在恶意网络行为者与对手在世界各地展开网络战争的日常战争中,端点安全(中世纪诗人可能会称其为“守卫大门的警惕哨兵”)当然是我们的互联数字世界的大门。 端点安全类似于我们今天称之为现代企业的数字有机体的免疫系统,可以将…

线性回归与最小二乘法

线性回归是统计学中的概念,以其建模速度快,不需要很复杂的计算并且模型解释性强等优点在机器学习中广泛应用。线性回归模型主要用于数据预测,其模型参数常用最小二乘法获得。 一、模型: 最开始人们得到了很多组带有测量误差的数…

JS中的事件和DOM操作

一、事件[重要] 1、 事件介绍 事件: 就是发生在浏览器(页面)上一件事,键盘事件,鼠标事件,表单事件,加载事件等等 2、 事件绑定方式 事件要想发生,就得将事件和标签先绑定(确定哪个标签发生什么事情,又有什么响应) 一个完整的事件有三部分 事件源(标签),哪里发出的事. 什么事(…

SAM核心代码注释总结

最近看sam2,顺便注释了下代码,方便回顾和分享。 PS: tensor的维度都基于默认参数配置。 SAM _build_sam sam模块包含三个部分,ImageEncoderViT、PromptEncoder和MaskDecoder: def _build_sam(encoder_embed_dim,encoder_depth…

HDMI20协议解析_Audio_Clock_Regeneration

HDMI20协议解析_Audio_Clock_Regeneration 1.版本说明 日期作者版本说明20240918风释雪初始版本 2.概述 当通过HDMI传输音频信号时,Audio Clock Regeneration(ACR)是必须要传输的数据包之一; HDMI传输过程中,音频采样…

大模型推理革新:探索思维图(DoT)框架的逻辑与应用

姚期智院士领衔推出了大模型新推理框架,CoT的“王冠”已难以承载。 提出了思维图(Diagram of Thought,DoT),使大模型的思考方式更接近人类。 团队为这一推理过程提供了数学基础,通过拓扑斯理论&#xff0…

分享6个icon在线生成网站,支持AI生成

在这个数字化的时代,创意和视觉标识在产品推广中可谓是愈发重要。提到图标,我们就不能不聊聊“Icon”这个小家伙。它不仅仅是个简单的视觉元素,简直是品牌信息的超级传递者。因此,图标生成器成了设计界的“万金油”,帮…

教授【优青】团队亲自指导-图解表观遗传学 | 组蛋白修饰!专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效,为农植物科研保驾护航!

教授【优青】团队亲自指导!提供专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效,为医学科研保驾护航! 专业实验外包服务,一站式解决您的所有需求; 还在犹豫?别让您的科研和论文停滞不前&#…

什么是前端开发 ?

每当我们访问网页时,为什么会有这么多样的图片、视频、动画、各种各样的元素呢?下面将为你揭晓! 一、 前端世界的基石 一切始于用户在浏览器地址栏输入一串字符,敲下回车。看似简单的动作,却开启了一段奇妙的旅程。 …

OmniPeek 空口抓包软件使用指导

OmniPeek 空口抓包软件使用指导 1 前置条件 PC机一台和TP_LINK(TL-WDN7200H)网卡一个 Omnipeek安装成功,TL-WDN7200H网卡驱动安装并设置成功 网卡插入到PC机的USB口 2 启动Omnipeek 3 打开Omnipeek 启动后打开Capture—Start Capture 注意网卡选择802.11的 4…

9月25日微语报,星期三,农历八月廿三

9月25日微语报,星期三,农历八月廿三,工作愉快,生活喜乐! 一份微语报,众览天下事! 1、多地响应取消普通与非普通住宅标准:降低居民购房成本,支持改善性需求。 2、中国将…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月25日,星期三

每天一分钟,知晓天下事! 2024年9月25日 星期三 农历八月廿三 1、 央行宣布:存量房贷利率下调约0.5个百分点,二套房最低首付比例15%。 2、 央行近期将下调存款准备金率0.5个百分点,向金融市场提供长期流动性约1万亿元…

Redis 分布式缓存服务(集群)

作者:程序那点事儿 日期:2023/11/17 13:05 准备6台虚拟机,ip分别是 192.168.10.101 192.168.10.102 192.168.10.103 192.168.10.104 192.168.10.105 192.168.10.106 创建6个节点 mkdir -p /usr/local/cluster/redis-node1 #对应192.168.10.…

阿里云函数计算 x NVIDIA 加速企业 AI 应用落地

作者:付宇轩 前言 阿里云函数计算(Function Compute, FC)是一种无服务器(Serverless)计算服务,允许用户在无需管理底层基础设施的情况下,直接运行代码。与传统的计算架构相比,函数…

ffmpeg解封装解码

文章目录 封装和解封装封装解封装 相关接口解封装的流程图关于AVPacket的解释如何区分不同的码流,视频流,音频流?第一种方式av_find_best_stream第二种方式 通过遍历流 代码 封装和解封装 封装 是把音频流 ,视频流,字…

LeetCode题练习与总结:删除链表中的节点--237

一、题目描述 有一个单链表的 head,我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。 删除给定的节点。注意&…

实例讲解电动汽车驱动扭矩控制策略及Simulink建模方法

电动汽车完成上电后进入Ready状态,此时车辆具备行车条件,处于行车准备状态。驾驶员挂挡(D挡或R挡)后,踩油门踏板即可控制车辆开始行车。对于电动汽车来说,驱动行车控制过程一般为,VCU接收Ready状…

高侧电流检测电路设计

1 简介 此单电源、高侧、低成本、电流检测解决方案可以检测 50mA 和 1A 之间的负载电流,并将其转换为 0.25V至 5V 的输出电压。高侧检测使系统能够识别接地短路,并且不会对负载造成接地干扰。 2 设计目标 2.1 输入 2.2 输出 ​​​ 2.3 电…

轴承介绍以及使用

轴承(Bearing)是在机械传动过程中起固定、旋转和减小载荷摩擦系数的部件。也可以说,当其它机件在轴上彼此产生相对运动时,用来降低运动力传递过程中的摩擦系数和保持转轴中心位置固定的机件。 轴承是当代机械设备中一种举足轻重的…

在java中怎么把对象转换成json,可以使用jackson

简述 在Spring Boot应用中,将Java对象转换为JSON字符串通常有两种主要方法:使用Jackson库或使用Gson库。由于Spring Boot默认集成了Jackson库,所以我们将重点介绍如何使用Jackson来进行对象到JSON的转换。 第1步:Maven添加依赖 …