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 时,可以考虑使用其他方式的有序集合

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mariadb实现主从同步

准备两台服务器 Mariadb-Master&#xff1a;192.168.44.150 Mariadb-Backup&#xff1a;192.168.44.148 安装mariadb&#xff1a; https://blog.csdn.net/qq_50247813/article/details/135402502?spm1001.2014.3001.5502 组从复制原理如下 修改主数据库配置如下 vi /etc/my.…

游戏、设计选什么内存条?光威龙武系列DDR5量大管饱

如果你是一位PC玩家或者创作者&#xff0c;日常工作娱乐中&#xff0c;确实少不了大容量高频内存的支持&#xff0c;这样可以获得更高的工作效率&#xff0c;光威龙武系列DDR5内存条无疑是理想之选。它可以为计算机提供强劲的性能表现和稳定的运行体验&#xff0c;让我们畅玩游…

【PB续命07】JDBC连接达梦数据库

JDBC(Java DataBase Connectivity) 称为Java数据库连接&#xff0c;它是一种用于数据库访问的应用程序API&#xff0c;由一组用Java语言编写的类和接口组成&#xff0c;有了JDBC就可以用同一的语法对多种关系数据库进行访问&#xff0c;而不用担心其数据库操作语言的差异。 有了…

中国IT产经新闻:新能源汽车发展前景与燃油车的利弊之争

随着科技的进步和环保意识的提高&#xff0c;新能源汽车在全球范围内逐渐受到重视。然而&#xff0c;在新能源汽车迅速发展的同时&#xff0c;燃油车仍然占据着主导地位。本文将从新能源与燃油车的利弊、新能源汽车的发展前景两个方面进行分析&#xff0c;以期为读者提供全面的…

Codeforces Hello 2024 A~D,F1

A.Wallet Exchange(思维) 题意&#xff1a; Alice和Bob各自拥有 a , b a,b a,b枚硬币&#xff0c;他们决定以Alice为先手开始比赛&#xff0c;比赛中每人在每轮需按顺序执行操作1和操作2&#xff1a; 操作1&#xff1a;交换两人手上拥有的硬币数量&#xff0c;或什么都不做 …

用python提取word中的所有图片

使用word中提取的方式图片会丢失清晰度&#xff0c;使用python写一个脚本&#xff0c;程序运行将弹出对话框选择一个word文件&#xff0c;然后在弹出一个对话框选择一个文件夹保存word中的文件。将该word中的所有图片都保存成png格式&#xff0c;并命名成image_i的样式。 程序…

JSP内置对象(9大内置对象和4种作用域)

JSP&#xff08;JavaServer Pages&#xff09;是一种用于开发动态Web应用程序的Java技术&#xff0c;它提供了一组内置对象和作用域&#xff0c;用于在JSP页面中访问和处理数据。 JSP的9大内置对象 request&#xff08;请求对象&#xff09;&#xff1a;代表客户端的HTTP请求&…

高校教务系统登录页面JS分析——河北农业大学教务系统

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

Python学习之路——文件部分【书接上回】

一、书接上回 上个博客我说过&#xff0c;为什么最开始的时候一定要将文件内的中文的逗号替换为英文的逗号&#xff0c;接下来&#xff0c;请看&#xff08;其实想一想&#xff0c;感觉没必要&#xff0c;不过也是好的&#xff0c;总要练练手的嘛&#xff09; def func03(st…

Allure03-报告结构解析

Allure03-报告结构解析 高清B站视频链接 一旦您了解了报告的外观。您可能希望获得更多数据丰富的报表。 您可能需要考虑为您的测试框架使用 Allure 适配器之一&#xff0c;这将允许收集 更多信息。跳转到集成部分&#xff0c;了解有关与测试框架集成的更多信息。 典型的报告由…

网络原理OSI

目录 一、应用层 1、功能 2、协议的分类 二、UDP原理&#xff08;传输层&#xff09; 1、协议端格式 2、格式解释 三、TCP原理&#xff08;传输层&#xff09; 1、协议端格式 2、长度 3、可靠传输 &#xff08;1&#xff09;确认应答 &#xff08;2&#xff09;超时…

设备树根节点下的compatile属性的作用

一. 简介 每个节点都有 compatible 属性&#xff0c;根节点 “ /” 也不例外。 imx6ull-alientek-emmc.dts 设备树 文件中的根 节点下也有一个 compatible 属性。 本文继续学习设备树文件的语法。具体学习根节点 "/" 下的 compatile属性的作用。 二. 设备树根节…

JavaScript的闭包、执行上下文、到底是怎么回事?还有必要学吗?

在上一课&#xff0c;我们了解了 JavaScript 执行中最粗粒度的任务&#xff1a;传给引擎执行的代码段。并且&#xff0c;我们还根据“由 JavaScript 引擎发起”还是“由宿主发起”&#xff0c;分成了宏观任务和微观任务&#xff0c;接下来我们继续去看一看更细的执行粒度。 一…

网络安全B模块(笔记详解)- Web渗透测试

Web渗透测试 1.通过渗透机Kali1.0对服务器场景PYsystem20192进行Web渗透测试(使用工具w3af的对目标Web服务器进行审计),在w3af的命令行界面下,使用命令列出所有用于审计的插件,将该操作使用的命令作为Flag值提交; 进入kali命令控制台中使用命令w3af_console进入w3af命令…

设计模式的艺术P1基础—2.4-2.11 面向对象设计原则

设计模式的艺术P1基础—2.4-2.11 面向对象设计原则 2.4 面向对象设计原则概述 向对象设计的目标之一在于支持可维护性复用&#xff0c;一方面需要实现设计方案或者源代码的重用&#xff0c;另一方面要确保系统能够易于扩展和修改&#xff0c;具有较好的灵活性。 面向对象设计…

收藏!一文读懂“灯塔工厂”完整申报流程

1、什么是灯塔工厂&#xff1f; 灯塔工厂是通过数字化、网络化和智能化手段&#xff0c;运用先进的工业4.0技术和理念&#xff0c;实现生产过程的全面自动化、精确化和优化。它不仅实现了数字化与物理世界的深度融合&#xff0c;而且提高了生产效率和质量&#xff0c;降低了制…

提升决策效率:探索NL2SQL和KBQA在实际应用中的奇迹

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…

kubernetes 网络解析

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 基础 Kubernetes 使用扁平网络模型&#xff0c;所有 Pod 都可以直接相互…

CLIP论文总结

文章目录 NLP的积淀Method1. 预训练的方法&#xff1a;放宽约束&#xff1a;对比学习2. 模型训练训练时间 ExperimentsMotivationPrompt&#xff1a;提示&#xff1a;也就是文本的引导作用Prompt enginneringPrompt ensembling 对比实验 NLP的积淀 取之不尽用之不竭的自监督信…

Maven 工程 java -jar 时提示 xxx-SNAPSHOT.jar 中没有主清单属性

Maven 工程 java -jar 时提示 xxx-SNAPSHOT.jar 中没有主清单属性 将skip属性注释掉或者改为false 如果为true&#xff0c;则工程找不到主启动类