Redis内存优化——Stream类型介绍及底层原理详解

news2024/12/23 18:37:41

系列文章目录

Redis内存优化——String类型介绍及底层原理详解
Redis内存优化——Hash类型介绍及底层原理详解
Redis内存优化——List类型介绍及底层原理详解
Redis内存优化——Set类型介绍及底层原理详解
Redis内存优化——ZSet类型介绍及底层原理详解
Redis内存优化——Stream类型介绍及底层原理详解


文章目录

  • 系列文章目录
  • 前言
  • Stream
    • 概述
    • 应用场景
    • 底层原理
      • Rax Tree
      • Stream
  • 总结


前言

Redis是一个开源的高性能键值数据库,它支持多种数据结构,如字符串、列表、集合、散列、有序集合等。在Redis 5.0版本中,新增了一种数据结构:Stream,它主要用于实现消息队列(MQ,Message Queue)

消息队列是一种异步通信机制,它允许多个生产者和消费者之间发送和接收消息,而不需要直接相互联系。消息队列有很多优点,如解耦、缓冲、重试、负载均衡、广播等。消息队列也有很多应用场景,如日志收集、任务调度、数据同步、事件驱动等。


Stream

概述

stream 是一个类似于日志的数据结构,它可以记录一系列的键值对,每个键值对都有一个唯一的 ID。一个 stream 类型的键最多可以存储 2^64 - 1 个键值对。

stream 类型的底层实现是 rax(基数树),它是一种压缩的前缀树结构,它将所有的键值对按照 ID 的字典序存储在一个树形结构中。rax 可以快速地定位、插入、删除任意位置的键值对

应用场景

stream 类型的应用场景主要是实现事件驱动的架构,比如:

  • 消息队列,利用 xadd 和 xread 命令实现生产者消费者模式。
  • 操作日志,利用 xadd 和 xrange 命令实现操作记录和回放。
  • 数据同步,利用 xadd 和 xreadgroup 命令实现多个消费者组之间的数据同步。

底层原理

Rax Tree

rax tree是一种基于基数树(radix tree)的变体,也叫做压缩前缀树(compressed prefix tree),它被应用于redis stream中,用来存储streamID,其数据结构为

typedef struct raxNode {
    uint32_t iskey:1;     /* Does this node contain a key? */
    uint32_t isnull:1;    /* Associated value is NULL (don't store it). */
    uint32_t iscompr:1;   /* 前缀是否压缩 */
    uint32_t size:29;     /* Number of children, or compressed string len. */
    unsigned char data[];
} raxNode;
  • iskey:是否包含key
  • isnull:是否存储value值
  • iscompr:前缀是否压缩。决定了size存储的是什么和data的数据结构
  • size
    • iscompr=0:节点为非压缩节点size是孩子节点的数量
    • iscompr=1:节点为压缩节点size是已压缩的字符串长度
  • data
    • iscompr=0:节点为非压缩节点,数据格式为[header strlen=0][abc][a-ptr][b-ptr][c-ptr](value-ptr?)。其有size个字符,
    • iscompr=1:节点为压缩节点,数据格式为[header strlen=3][xyz][z-ptr](value-ptr?)

为了便于理解,设定一些场景举例说明

场景一:只插入foot

数据结构为:
请添加图片描述

其中,z-ptr指向的叶子节点的iskey=1,标识foot这个key。下图为使用树状图的形式来展现其数据结构
请添加图片描述

场景二:插入foot后,插入footer

数据结构为:

请添加图片描述

其插入过程为:

  1. foot节点中每个字符进行比较,获得最大公共前缀foot
  2. er作为foot的子节点,其iskey=1,标识foot这个key
  3. er的子节点的iskey=1,标识footer这个key

下图为使用树状图的形式来展现其数据结构

请添加图片描述

场景三:插入foot后,插入fo

数据结构为:

请添加图片描述

其插入过程为:

  1. foot节点中每个字符进行比较,获得最大公共前缀fo
  2. foot拆成foot
  3. ot作为fo的子节点,其iskey=1,标识fo这个key
  4. 设置ot的子节点的iskey=1,标识foot这个key

下图为使用树状图的形式来展现其数据结构

请添加图片描述

场景四:插入foot后,插入foobar

数据结构为:

请添加图片描述

其插入过程为:

  1. foot节点中每个字符进行比较,获得最大公共前缀foo
  2. foot拆成foot
  3. footbar拆成foobar
  4. tb作为foo的子节点
  5. 设置ot的子节点的iskey=1,标识foot这个key
  6. ar作为b的子节点
  7. 设置ar的子节点的iskey=1,标识footbar这个key

下图为使用树状图的形式来展现其数据结构

请添加图片描述

Stream

stream的底层使用了rax treelistpack两种结构,rax tree用来存储streamID,而listpack用来存储对应的值,结构图如下:

请添加图片描述


总结

本文介绍了Redis Stream的类型介绍及底层原理。Redis Stream是一种非常强大和灵活的数据结构,它不仅可以实现高级消息队列的功能,还可以支持多种模式和场景。Redis Stream是Redis 5.0版本中新增加的数据结构,它体现了Redis作为一个开源项目不断创新和进步的精神。

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

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

相关文章

4 个无质量损失的免费在线图像压缩器

本文内容:最佳在线图像优化器,无质量损失,可让您压缩 JPG、PNG 和 GIF 文件。 在线图像优化器工具可帮助您压缩图像而不会降低质量。并给出图像可以压缩多少的想法。 经过测试和比较的没有质量损失的最佳在线图像优化器 4 个无质量损失的免…

网管必备技巧:如何跟踪IP地址

作为网管员,在我们解决Windows 操作系统的DHCP故障时,有时要找出某个地址范围内有哪些地址没有被使用。方法:打开命令提示窗口,在For…in…Do循环中调用ping命令。 例如,为了找出在地址范围192.168.1.1 到 192.168.1.1…

左耳朵耗子

晚上回来后,到coolshell上看文章。 程序员是一件非常累的工作,在我看到稚晖君做出那么多优秀的产品,我是很惊叹的,因为我知道那需要付出非常非常多的时间和精力,当大家都在夸赞的时候,我也能发现稚晖君发梢…

GitHub Copilot:神一样的代码助手

我肝肯定,很多很多小伙伴还不了解 Copilot 是什么,尤其是初学计算机的小伙伴,我这里普及一下吧! GitHub Copilot 是一个基于 AI 的代码自动完成工具,由 GitHub 和 OpenAI 共同开发。 GitHub 和 OpenAI 想必大家都很清楚…

《计算机网络——自顶向下编程》精炼——3.4.4

人生的旅途,前途很远,也很暗,名言警句励志。然而不要怕,不怕的人的面前才有路。——鲁迅 文章目录 选择重传(SR) 选择重传(SR) 选择重传协议是另一种流水线rdt协议。与GBN协议最大的区别是当发送方收到一个失序分组时&#xff0c…

微信小程序实现人脸识别(戴面具效果)

节前准备:文档: xr-frame 模型链接 (注明:来源于微信开放文档) 基础要点: 1.ar-system"modes:Face;camera:Front" ar-system 表示ar系统,camera表示相机(默认为后置Back,前置为Front) modes 表示模式,目前支持平面识…

DSBC176 3BSE019216R1​有综合保护器、电流表、电压表等器件​

​ DSBC176 3BSE019216R1 有综合保护器、电流表、电压表等器件 另一个方法是先对数组排序,然后取中间元素即可,因为如果某个元素的个数超过一半,那么数组排序后该元素必定占据数组的中间位置。 求数组中元素的最短距离 给定一个含有n个元素…

大数据分析案例-基于GBDT梯度提升决策树算法构建数据科学岗位薪资预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

中小企业CRM如何选型?

中小企业CRM如何选型?这就来分享一下! 中小企业客户关系管理系统(CRM)的选型需要考虑多个方面,包括成本,功能,易用性,扩展性和安全性。 预算:中小企业的预算通常有限,因此成本是选…

sudo unable to open read-only file system”的原因

此错误是由多种原因引起的,包括: 文件系统不一致。文件系统配置错误(/etc/fstab 文件中的错误条目)。由于各种原因(包括突然断电或电缆损坏)导致系统意外或突然关闭。在某些情况下,Windows 的双…

TDengine数据库与Mybatis-plus 多租户屏蔽

使用TDengine时序数据库特有的查询: select sum(gen_power_total) gen_power_totals,last(ts) xdate from power.device_0123456 where ts >2023-05-16 08:53:05 and ts < 2023-05-17 08:53:05 interval(1h) ; 错误提示…

UM2010一款单片集成低功耗 Sub-1GHz 射频收发器芯片

UM2010 是一款工作于 200MHz~960MHz 范围内的低功耗、高性能、单片集成的(G)FSK/OOK 无线收发机芯片。内部集成完整的射频接收机、射频发射机、频率综合器、调制解调器&#xff0c;只需配备 简单、低成本的外围器件就可以获得良好的收发性能。 芯片支持灵活可设的数据包格式&am…

Java使用Groovy执行脚本的使用,GroovyShell Matespace内存溢出解决

目录 业务场景 使用了工具Groovy 遇到Metaspace内存溢出的问题 解决方案 业务场景 类似工作流的场景&#xff0c;需要判断 参数&#xff0c;是否满足流转条件。 随便举个例子: 新增商品资料。 如果是普通商品&#xff0c;状态为"待审核"&#xff0c; 如果为…

mapbox加载多个大数据图层并且播放的技术优化路线

先看成果图 介绍 首先介绍一下我这个数据有15W的面数据&#xff0c;可以即时渲染&#xff0c;即时加载&#xff0c;然后播放。 技术路线 首先这种数量级的大数据&#xff0c;用别的二维API是绝对不可行的&#xff0c;arcgis和openlayer自动放弃&#xff0c;leaflet最多可以坚…

漏测分析的目的

漏测分析的目的 漏测分析是软件测试过程中的一项重要工作&#xff0c;旨在识别和分析测试工作中可能存在的遗漏或疏漏&#xff0c;从而进一步提高软件质量和可靠性。 漏测分析的主要目的是找出未被覆盖的测试用例&#xff0c;即未能被测试到的功能或者代码路径。通过漏测分析&a…

纷享销客PaaS平台之“业务对象定制”

如何填补产品与市场之间的鸿沟&#xff1f;一定程度的定制化是高效运营的基础。 今天的企业需要的不再是简单的几套标准化系统&#xff0c;而是一个能够支撑业务常态化调整、兼具高性能与可扩展的弹性平台。 纷享销客PaaS平台基于元数据模型驱动&#xff0c;提供零代码和低代码…

【FMC148】8 路500MSPS/1GSPS/1.25GSPS 采样率14 位AD 采集FMC 子卡模块-具有出色的同步采集性能(AD9680)

板卡概述 FMC148 是一款基于VITA57.4 标准的JESD204B 接口FMC 子卡模块&#xff0c;该模块可以实现8 路14-bit、500MSPS/1GSPS/1.25GSPSADC 采集功能。该板卡ADC 器件采用ADI 公司的AD9680 芯片,全功率-3dB 模拟输入带宽可达2GHz。该ADC 与FPGA 的主机接口通过16 通道的高速串…

多表联查及mybatis中@Results,@ResultMap注解的应用

在实际的项目中&#xff0c;为了保证数据的简洁和查询的效率&#xff0c;通常会到采用多表联查。 那么什么是多表联查呢&#xff1f; 一般查询语句都是针对一个表的&#xff0c;但是在关系型数据库中&#xff0c;表与表之间是有联系的&#xff0c;所以在实际应用中&#xff0…

Vue3实现酷炫打字机效果:让你的网站文字动起来

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、介绍1.1 什么是酷炫打字机效果1.2 Vue3框架简介二、创建Vue3项目2.1 安装Vue CLI2.2 创建Vue3项目2.3 运行项目

基于回归模型(贝叶斯岭回归、XGB、SVR等)销售额预测

博主在之前也写过较多的预测模型的文章&#xff0c;主要是基于LSTM&#xff0c;见下&#xff1a; 使用 Conv1D-LSTM 进行时间序列预测&#xff1a;预测多个未来时间步【优化】 使用 Conv1D-LSTM 进行时间序列预测&#xff1a;预测多个未来时间步 LSTM-理解 Part-1&#xff08;R…