2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景

目录

引言

Zset 集合命令

ZINTERSTORE

ZUNIONSTORE

Zset 编码方式

Zset 应用场景

排行榜系统


引言

  • 在 Redis 中集合间操作无非就是 交集、并集、差集 
  • Set 类型与之相对应的操作命令为 sinter、sunion、sdiff

注意:

  • 从 Redis 6.2 版本开始,Zset 命令才开始支持 zinter、zunion、zdiff 这几个命令
  • 但是此处我们使用的是 Redis 5 版本,所以下文不涉及介绍这三个命令

Zset 集合命令

ZINTERSTORE

  • 用于求出给定有序集合中元素的交集,并将其保存进目标有序集合中
  • 合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数

语法:

zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <sum | min | max>]
  • destination:表示要把结果存储到哪个 key 对应的 zset 中
  • numkeys:描述了后续有几个 key 参与交集运算,因此该变量需为整型
  • weight:可理解为 权重,此处指定的权重,相当于一个系数,会乘以当前的分数
  • aggregate:指定 当前给定的有序集合 应采用哪种聚合方式来得出新的分数

注意:

  • 前面介绍的命令也是支持多个 key 的,如mget、mset 等
  • 但这些命令却不涉及到类似于此处的设定,即需手动指出 key 的个数

官方文档解释:

  • 主要是为了避免 zinterstore 命令的 选项 和 keys 弄混淆
  • 即通过 numkeys 描述出 key 的个数后,便可明确知道后面的 "选项" 是从哪里开始的

总结:

  • 正因为 mget、mset 等命令,在指定 keys 后无复杂的选项
  • 所以无需采用 numkeys 来手动指出 key 的个数,以便知道 key 和 选项 之间的分界处

时间复杂度:

  • O(N) + O(M * logM)
  • N 为 所有输入命令中总的 有序集合 元素个数
  • M 为 结果集 的元素个数

实例理解

  • 此处我们可以指定 权重

  • 我们还可以指定 聚合方式


ZUNIONSTORE

  • 用于求出给定有序集合的并集,并将其保存到目标有序集合中
  • 合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数

语法:

zunionstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <sum | min | max>]
  • zunionstore 和 zinterstore 命令的用法大致相同

时间复杂度:

  • O(N) + O(M * logM)
  • N 为 所有输入命令中总的 有序集合 元素个数
  • M 为 结果集 的元素个数

实例理解

  • 此处我们可以指定 权重

  • 我们还可以指定 聚合方式

Zset 编码方式

  • 有序集合的内部编码有 两种
  1. ziplist(压缩列表)
  2. skiplist(跳表)

注意点一:

  • 如果有序集合中的元素个数较少,或者单个元素体积较小时
  • 使用 ziplist 来存储,以达到 节省空间 的效果

注意点二:

  • 如果有序集合中的元素个数较多,或者单个元素体积非常大时
  • 使用 skiplist 来存储

两个配置项

  1. ​​​​​​zset-max-ziplist-entries:(单位为元素个数)
  2. zset-max-ziplist-value:(单位为字节)
  • 当有序集合的元素个数小于 1号配置项,当每个元素的值都小于 2号配置项时
  • Redis 会使用 ziplist 来作为有序集合的内部编码

关于跳表

  • 简单来说,跳表是一个 复杂链表,其查询元素的时间复杂度为 O(logN)
  • 相比于树形结构,更适合按照范围获取元素(B+ 树)

Zset 应用场景

排行榜系统

  • 微博热搜、游戏天梯排行、成绩排行等

关键要点:

  • 用来排行的分数为实时变化的
  • 虽然是实时变化的,却也能够高效的更新排行

重点理解:

  • 有序集合(zset) 能很好的满足上述需求和关键要点

实例理解

  • 比如游戏天梯排行
  • 只需要将 玩家信息和该玩家所对应的分数给放到有序集合中即可
  • 从而便能 自动就形成一个排行榜
  • 我们也能 随时按照排行(下标)、按照分数 来进行范围查询
  • 随着分数发生改变,也可以比较方便的使用 zincrby 命令来修改分数,且排行榜顺序也能自动进行调整,该操作的时间复杂度为 O(logN)

问题:

  • 游戏玩家这么多,此时都用这个 zset 来存,内存能否存下?

举例:

  • 假设此时我们有 1亿 个玩家
  • 约定 userId 4个字节,score 8个字节,即一个玩家需要 12 个字节来表示
  • 12亿 字节 ——> 1.2 GB,对于当今计算机来说,绰绰有余!

实例理解二

  • 相较于游戏排行榜,其排序依据很容易确定,仅需根据玩家积分即可
  • 微博的排行榜,其排序依据评估起来更为复杂,因为 微博热度是一个综合数值!
  • 其参考方面包含 浏览量、点赞量、转发量、评论量等
  • 上述各方面具有不同 权重 weight,进而计算得到综合数值(热度)

重点理解

  • 此时可以借助 zinterstore / zunionstore 命令,按照加权方式进行处理
  • 可以把上述每个维度的数值均放到一个有序集合中
  • member 为 微博的id,score 为各自维度的数值
  • 通过  zinterstore / zunionstore 命令将上述有序集合按照约定好的权重,进行集合间运算即可
  • 最终得到结果集合,其分数便为热度,且 排行榜也顺带着出来了!

总结:

  • 上述应用场景,Redis 中的 zset 是一个选择,但不是说非得用 Reids 中的 zset 不可
  • 有些场景下确实可以使用到有序集合,但又不方便使用 Redis 时,可以考虑使用其他方式的有序集合

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可充电助听器有哪些优势?

可充电助听器有哪些优势 01 无需频繁更换电池&#xff0c;对于手指不灵活、眼神不好的老年用户以及无法自行更换电池的儿童用户&#xff0c;使用更为方便。 02 可充电助听器的电池一般密封在助听器内部&#xff0c;机身的防水防尘性能更强。 03 部分充电盒具有快充、储电、…

SNP分享:企业并购与拆分的关键成功因素

成功执行并购或拆分需要考虑的关键因素 合并、收购和资产剥离对CIO和CFO来说都是一项艰巨的任务&#xff1b;它们在业务和技术方面都具有很大影响力&#xff0c;企业并购或拆分在数据迁移方面需要考虑哪些关键因素&#xff1f; 一、在迁移中构建自动化 先确定要迁移、集成或剥离…

计算机体系结构流水线学习记录

一、知识点汇总 1.理想情况下&#xff0c;流水线能够实现 n 倍的吞吐率加速比&#xff08;n为流水线深度&#xff09;&#xff0c;但是流水线深度并非越大越好&#xff0c;因为流水线的深度会影响到性能和功耗之间的平衡。 2.RISC&#xff1a;Reduced Instruction Set Comput…

NetCore使用SixLabors组件生成图片

主要用到SixLabors.Fonts(2.1.0)和SixLabors.ImageSharp.Drawing(2.1.0)组件 这里我把组件创建成一个单独的类库&#xff0c;供其他模块来同意调用 ISixLaborsExtensions.cs using SixLabors.Fonts; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Drawing.Processi…

【算法Hot100系列】搜索旋转排序数组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

[AutoSar]基础部分 RTE 05 Port的实例化和初始化

目录 关键词平台说明一、端口类型二、端口的实例化2.1 创建application port2.2 实例化 三、初始化 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、端口类型 如下图所示&am…

一种DevOpts的实现方式:基于gitlab的CICD(一)

写在之前 笔者最近准备开始入坑CNCF毕业的开源项目&#xff0c;看到其中有一组开源项目的分类就是DevOpts。这个领域内比较出名的项目是Argocd&#xff0c;Argo CD 是一个用于 Kubernetes 的持续交付 (Continuous Delivery) 工具&#xff0c;它以声明式的方式实现了应用程序的…

scipy-interpolate整理

文章目录 scipy-interpolate整理Univariate interpolation 单变量插值Multivariate interpolation 多元插值Unstructured data 非结构化数据&#xff1a;:For data on a grid 对于网格上的数据&#xff1a;:Tensor product polynomials 张量积多项式&#xff1a;: 1-D Splines …

Windows更新 遇到错误 你的设备中缺少重要的安全和质量修复 0x80070643问题解决

一、原因 日常Windows更新时&#xff0c;突然出现以下错误&#xff1a; 二、最简单的方法 官方网址windows10升级工具进行更新&#xff1a;https://www.microsoft.com/zh-cn/software-download/windows10/   更新助手可以帮助你更新到 Windows 10 的最新版本&#xff0c…

【刷题日记】青少年CTF-Misc(三)A1-Misc部分完结!撒花!

StegoTXT 题目难度&#xff1a;★ 题目编号&#xff1a;QSNCTF-2023-T-MISC-20230228003 题目描述&#xff1a;今天维护网站的时候出了一道这样的题目&#xff0c;上传上来看看大家怎么解&#xff0c;flag格式为&#xff1a;qsnctf{xxx}。 下载解压文件&#xff0c;得到一个…

海淘注意事项科普

关税和税费&#xff1a; 在海淘过程中&#xff0c;您可能需要支付关税和其他税费。了解目标国家的相关规定&#xff0c;预先了解可能的费用&#xff0c;并确保考虑到这些额外成本。 货币汇率&#xff1a; 注意货币汇率的波动&#xff0c;以避免因兑换率变化导致支付更多费用。…

嵌入式-C语言-江科大-指针的详解与应用

文章目录 一&#xff1a;计算机存储机制二&#xff1a;定义指针三&#xff1a;指针的操作四&#xff1a;数组与指针五&#xff1a;指针的应用道友&#xff1a;最清晰的脚印&#xff0c;踩在最泥泞的道路上。 推荐视频配合我的笔记使用 [C语言] 指针的详解与应用-理论结合实践&a…

Flask修改Response Headers中的Server值

Headers中的Server会暴露出Python版本&#xff0c;导致的结果就是方便被渗透快速定位Python版本后找到对应版本的漏洞&#xff0c;因此导致网络安全问题 伪方法&#xff1a; 像这个马上就暴露出Python版本&#xff0c;如何解决这个网络上有说直接用response.headers.remove(Ser…

Windows内存管理(二):内存架构 浅谈一二

《Windows内存管理&#xff08;一&#xff09;&#xff1a;Windows性能监视器(PerfMon)》 Windows内存管理是一个复杂的主题&#xff0c;涉及多个层次和组件。以下是一个分层的概述。 1、虚拟内存管理 Windows使用虚拟内存来给每个进程提供一个看似连续的内存空间&#xff0c…

Java学习笔记-day01-Flowable工作流入门

课程来源B站大佬波哥的课程 本文仅做笔记&#xff0c;课件需要的联系B站大佬获取 0.前置 相关话术 流程定义&#xff08;Process Definition&#xff09;&#xff1a; 描述业务流程的定义&#xff0c;通常使用BPMN&#xff08;Business Process Model and Notation&#xff09…

没有货源是不是就没办法在家做抖店?打包发货怎么完成?解答如下

我是王路飞。 有人问了我一个问题&#xff1a;无货源模式的抖店&#xff0c;自己一个人在家里做不了是吧&#xff1f;毕竟打包发货这些问题怎么解决呢&#xff1f; 店铺要是发货不及时被平台罚款怎么办&#xff1f;产品有质量问题怎么解决呢&#xff1f;店铺一直不出单怎么办…

并发程序设计--D5~D7线程的创建、回收和取消清理

一个进程中的多个线程共享以下资源 可执行指令 静态数据 进程中打开的文件描述符 当前工作目录 用户ID 用户组ID 每个线程私有的资源 线程ID PC&#xff08;程序计数器&#xff09;和相关寄存器 堆区和栈区 错误号&#xff08;errno&#xff09; 优先级 执行状态和属性 线程的…

2024阿里云服务器ECS实例全方位介绍_优缺点大全

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云服务器网aliyu…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户信息修改实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

数字化解决方案在市政交通大显身手

Bentley 应用程序促进了创新设计解决方案&#xff0c;预计可在 25 年内节省 3,200 万美元 大规模现代化计划 大学大道位于爱荷华州锡达福尔斯市繁忙的社区&#xff0c;是一条重要的六车道高速公路&#xff0c;长约两英里&#xff0c;每天通行的车辆有 2 万多辆。该道路已有 60…