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 编码方式
- 有序集合的内部编码有 两种
- ziplist(压缩列表)
- skiplist(跳表)
注意点一:
- 如果有序集合中的元素个数较少,或者单个元素体积较小时
- 使用 ziplist 来存储,以达到 节省空间 的效果
注意点二:
- 如果有序集合中的元素个数较多,或者单个元素体积非常大时
- 使用 skiplist 来存储
两个配置项
- zset-max-ziplist-entries:(单位为元素个数)
- 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 时,可以考虑使用其他方式的有序集合
相关文章:

2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景
目录 引言 Zset 集合命令 ZINTERSTORE ZUNIONSTORE Zset 编码方式 Zset 应用场景 排行榜系统 引言 在 Redis 中集合间操作无非就是 交集、并集、差集 Set 类型与之相对应的操作命令为 sinter、sunion、sdiff 注意: 从 Redis 6.2 版本开始,Zset 命…...

ffmpeg[学习(四)](代码实现) 实现音频数据解码并且用SDL播放
0、作者杂谈 CSDN大多数都是落后的,要么是到处复制粘贴的,对于初学者我来说困惑了很久,大多数CSDN文章都是使用旧的API ,已经被否决了,于是我读一些官方文档,和一些开源项目音视频的输出过程,写…...
C++ 字符串哈希 || 字符串前缀哈希法
字符串Hash就是构造一个数字使之唯一代表一个字符串。但是为了将映射关系进行一一对应,也就是,一个字符串对应一个数字,那么一个数字也对应一个字符串。 用字符串Hash的目的是,我们如果要比较一个字符串,我们不用直接比…...
【java】项目部署liunx服务器的简单步骤
在Linux服务器上部署Java项目通常涉及到一系列步骤,下面是一个基本的部署流程,具体步骤可能会根据项目和服务器环境的不同而有所调整: 1. 准备工作: 1.1 安装Java环境: 在Linux服务器上安装Java运行环境,…...

深度学习笔记(五)——网络优化(1):学习率自调整、激活函数、损失函数、正则化
文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 通过学习已经掌握了主要的基础函数之后具备了搭建一个网络并使其正常运行的能力,那下一步我们还…...

鸿蒙开发现在就业前景怎样?
随着科技的不断进步,鸿蒙系统逐渐崭露头角,成为智能设备领域的一颗新星。作为华为自主研发的操作系统,鸿蒙系统拥有着广阔的市场前景和就业机会。那么,鸿蒙开发的就业前景究竟怎样呢? 一、市场需求持续增长 随着鸿蒙…...

试用统信服务器操作系统UOS 20
作者:田逸(formyz) 试用统信Linux操作系统UOS,想了解一下用已有的Linux经验能否轻松驾驭它。以便在某些场景下,可以多一种选择。本次试验在Proxmox VE 8(以下简称PVE 8)平台下进行,采…...

[情商-11]:人际交流的心理架构与需求层次模型
目录 前言: 一、心理架构 1.1 个体生理层 1.2 个体心理层 1.3 点对点人际交流层 1.4 社会网络层 1.5 社会价值层 二、人的需求层次模型 2.1 需求(欲望)层次模型 2.2 基因与人需求之间的关系 2.3 个体生理需求 2.4 个体的心理需求…...

【.NET Core】Lazy<T> 实现延迟加载详解
【.NET Core】Lazy 实现延迟加载详解 文章目录 【.NET Core】Lazy<T> 实现延迟加载详解一、概述二、Lazy<T>是什么三、Lazy基本用法3.1 构造时使用默认的初始化方式3.2 构造时使用指定的委托初始化 四、Lazy.Value使用五、Lazy扩展用法5.1 实现延迟属性5.2 Lazy实现…...

坑记(HttpInputMessage)
一、背景知识 public interface HttpInputMessage extends HttpMessage Represents an HTTP input message, consisting of headers and a readable body.Typically implemented by an HTTP request on the server-side, or a response on the client-side.Since: 3.0 Author:…...
day04打卡
day04打卡 面试题 02.07. 链表相交 时间复杂度:O(N),空间复杂度:O(1) 第一想法:求出两个链表长度,走差距步,再遍历找有没有相交 /*** Definition for singly-linked list.* struct ListNode {* int…...

语义分割miou指标计算详解
文章目录 1. 语义分割的评价指标2. 混淆矩阵计算2.1 np.bincount的使用2.2 混淆矩阵计算 3. 语义分割指标计算3.1 IOU计算方式1(推荐)方式2 3.2 Precision 计算3.3 总体的Accuracy计算3.4 Recall 计算3.5 MIOU计算 参考 MIoU全称为Mean Intersection over Union,平均…...

Unity3d 实现直播功能(无需sdk接入)
Unity3d 实现直播功能 需要插件 :VideoCapture 插件地址(免费的就行) 原理:客户端通过 VideoCapture 插件实现推流nodejs视频流转服务进行转发,播放器实现rtmp拉流 废话不多说,直接上 CaptureSource我选择的是屏幕录制,也可以是其他源 CaptureType选择LIVE–直播形式 LiveSt…...

计算机缺失msvcr100.dll如何修复?分享五种实测靠谱的方法
在计算机系统的日常运行与维护过程中,我们可能会遇到一种特定的故障场景,即系统中关键性动态链接库文件msvcr100.dll的丢失。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分,对于许多基于Windows的应用程序来说ÿ…...

面试宝典进阶之redis缓存面试题
R1、【初级】Redis常用的数据类型有哪些? (1)String(字符串) (2)Hash(哈希) (3)List(列表) (4)Se…...

调试(c语言)
前言: 我们在写程序的时候可能多多少少都会出现一些bug,使我们的程序不能正常运行,所以为了更快更好的找到并修复bug,使这些问题迎刃而解,学习好如何调试代码是每个学习编程的人所必备的技能。 1. 什么是bug…...

opencv-4.8.0编译及使用
1 编译 opencv的编译总体来说比较简单,但必须记住一点:opencv的版本必须和opencv_contrib的版本保持一致。例如opencv使用4.8.0,opencv_contrib也必须使用4.8.0。 进入opencv和opencv_contrib的github页面后,默认看到的是git分支&…...

Jmeter 性能-监控服务器
Jmeter监控Linux需要三个文件 JMeterPlugins-Extras.jar (包:JMeterPlugins-Extras-1.4.0.zip) JMeterPlugins-Standard.jar (包:JMeterPlugins-Standard-1.4.0.zip) ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Perform…...

Excel学习
文章目录 学习链接Excel1. Excel的两种形式2. 常见excel操作工具3.POI1. POI的概述2. POI的应用场景3. 使用1.使用POI创建excel2.创建单元格写入内容3.单元格样式处理4.插入图片5.读取excel并解析图解POI 4. 基于模板输出POI报表5. 自定义POI导出工具类ExcelAttributeExcelExpo…...
【技能---labelme软件的安装及其使用--ubuntu】
文章目录 概要Labelme 是什么?Labelme 能干啥? Ubuntu20.04安装Labelme1.Anaconda的安装2.Labelme的安装3.Labelme的使用 概要 图像检测需要自己的数据集,为此需要对一些数据进行数据标注,这里提供了一种图像的常用标注工具——la…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...