【Redis7】10大数据类型之Stream类型

1. Stream简介

Redis Stream 是在Redis 5.0版本中引入的一种新的数据结构,它主要用于实时数据处理场景,如消息队列、日志记录和实时数据分析等。Stream的设计灵感部分来源于消息队列系统,如Kafka,但它提供了更直接集成到Redis生态系统中的能力。

简单来说:Stream就是消息中间件+阻塞队列

Redis Stream 类型本身设计时就充分考虑了生产者消费者模型的需求。它不仅包含了这一模型,还对其进行了优化和扩展,以便更好地适应现代分布式系统中的消息传递场景。

  • 生产者:任何可以向Redis Stream写入消息的客户端都可以视为生产者。生产者使用XADD命令向Stream中添加消息,每个消息都附有一个全局唯一的ID,确保消息的顺序性和可追踪性。
  • 消费者:消费者使用XREADXREADGROUP命令从Stream中读取消息。特别是XREADGROUP命令,它支持消费者组(Consumer Group)的概念,这是生产者消费者模型中的一个重要组成部分。消费者组让多个消费者可以协作处理Stream中的消息,同时保证了消息不会被重复处理。
  • 消费者组:Stream支持消费者组,组内的消费者共享消息,但每个消息只由组内的一个消费者处理,从而实现了消息的有序和公平分配。消费者组还允许消费者在处理失败时重新分配消息,以及通过XACK命令确认消息已成功处理,实现消息的确认机制。
  • 消息持久化与顺序性:Stream中的消息是持久化的,确保了即使在Redis服务器重启后,消息也不会丢失。同时,Stream保持消息的严格顺序,这对于某些依赖消息顺序的应用场景至关重要。
  • 阻塞读取与自定义读取策略:消费者可以选择阻塞读取模式,这意味着当没有新消息时,消费者会等待直至新消息到达。此外,还可以通过参数定制读取的起始位置、消息数量或时间范围,提供了高度的灵活性。

Stream类型主要特点:

  1. 有序性:Stream中的消息按照ID排序,每个消息都有一个全局唯一的ID,确保了消息的顺序。
  2. 持久化:Stream中的数据是持久化的,即使Redis服务器重启,消息也不会丢失。
  3. 多播与分组消费:支持多个消费者同时消费同一流中的消息,而且可以将消费者组织成消费组,实现消息的分组消费,每个消息可以被一个或多个组消费,但组内每个消息只会被其中一个消费者消费(类似于Kafka的分区消费者模型)。
  4. 灵活的数据结构:每条消息可以包含多个字段(field-value对),提供了高度的灵活性来携带复杂的数据。
  5. 消费者进度跟踪:消费者可以在读取消息时自动追踪自己的消费进度,Redis使用Last Seen Displacement (LSD) 来跟踪消费者的读取位置。
  6. 读取控制:支持多种读取模式,包括从特定消息ID读取、读取最近的N个消息、读取某个时间范围内的消息等。
  7. 阻塞读取:可以使用XREADXREADGROUP命令以阻塞的方式等待新消息,直到有新消息到达或超时。

Stream数据结构图:

一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容

image-20240512222700120

内容 含义
Message Content 消息内容
Consumer group 消费组,通过XGROUP CREATE 命令创建,同一个消费组可以有多个消费者
Last_delivered_id 游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
Consumer 消费者,消费组中的消费者
Pending_ids 消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息Id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理

2. 生产消息命令(XADD)

XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]:向Stream(key)中添加一条消息,ID可以是自动生成或指定的唯一标识符,后面跟着一个或多个字段值对。

这个命令有三个注意点:

  • 消息id要比上个id大
  • 默认用*表示自动生成规矩
  • *:用于XADD命令,表示让系统自动生成id(类似于MySQL的自增主键)

示例:

127.0.0.1:6379> xadd k1 * name zhangsan age 18
1715525079420-0 # 系统自动生成的id
127.0.0.1:6379> xadd k1 * name lisi age 19
1715525087805-0
127.0.0.1:6379> xadd k1 * name wangwu age 20
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比奇堡的天没有云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值