Redis Stream 是 Redis 5.0 引入的持久化消息队列数据结构,其核心原理围绕消息存储机制 、消费者组模型 和消息回溯能力实现,具体如下:
一、消息存储结构
- 时间序列链表
Stream 以时间戳-序列号(如1630000000000-0)为消息 ID,按时间严格有序存储在内存中,形成只追加(append-only)的日志型链表 。新消息通过XADD命令追加到末尾,自动生成唯一递增 ID(支持自定义或*自动生成)。 - 大容量优化
支持MAXLEN参数限制队列长度(如XADD stream MAXLEN 1000 * field value),自动淘汰旧消息防止内存溢出。 
二、消费者组(Consumer Group)机制
| 组件 | 作用 | 关键命令 | 
|---|---|---|
| 消费者组 | 将消息分发给组内多个消费者,实现负载均衡 | XGROUP CREATE | 
| 消费者 | 组内独立工作单元,通过唯一名称标识 | XREADGROUP GROUP | 
| 待处理列表 | 存储已分发但未确认(ACK)的消息,避免消息丢失 | XPENDING | 
| ACK 机制 | 消费者处理完成后发送 XACK,消息从待处理列表移除;超时未确认则重新投递 | 
XACK / XCLAIM | 
工作流程:
            
            
              bash
              
              
            
          
          # 创建消费者组
XGROUP CREATE mystream mygroup $  # $ 表示从新消息开始消费
# 消费者读取消息
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >
# > 表示消费未处理的新消息
# 确认消息处理完成
XACK mystream mygroup 1630000000000-0
        注:同组内消息被竞争消费(每条消息仅由一个消费者处理),不同组独立消费全量消息。
三、消息回溯与持久化
- 历史消息读取
通过指定消息 ID 范围(如XREAD STREAMS mystream 0-0)读取任意历史数据,支持按时间范围过滤。 - 阻塞式消费
XREADGROUP支持BLOCK参数(如BLOCK 5000),无消息时阻塞等待 5 秒,避免轮询开销。 - 数据持久化
依赖 Redis 的 RDB/AOF 机制持久化 Stream 数据,重启后恢复完整队列状态。 
四、与传统消息队列对比
| 特性 | Redis Stream | Kafka/RabbitMQ | 
|---|---|---|
| 部署复杂度 | 轻量级,内置 Redis | 需独立集群部署 | 
| 消息回溯 | 天然支持 | 依赖配置 | 
| 持久化机制 | RDB/AOF | 磁盘日志 | 
| 事务支持 | 无 | 部分支持 | 
适用场景:实时消息推送、日志收集、流处理中间件等轻量级异步任务,但对强事务或复杂路由支持较弱。