Redis Stream 数据结构详解
Redis Stream 是 Redis 5.0 版本引入的新型数据结构,专门用于处理有序、可追溯的消息流。其核心特性包括消息持久化、有序性以及消费者组支持,使其成为构建可靠消息系统的理想选择。
基本概念与特性
Stream 本质上是一个有序消息日志,每条消息都具有唯一 ID 并按添加顺序严格排列。开发者可以执行以下操作:
- 消息的发布与消费
- 消息删除管理
- 实时消息订阅
- 消费者组协同处理
核心优势(相较于 Pub/Sub)
- 消息持久化:克服了传统 Pub/Sub 消息易丢失的缺陷,支持网络中断/服务重启后的数据恢复
- 主备复制:确保全时段数据可访问性
- 消费位置记忆:精确记录各客户端消费进度
典型应用场景
- 消息队列系统
- 实时日志收集
- 即时数据处理
- 在线聊天室
核心特性详解
1. 消息有序性
所有消息严格按发布时间排序,消费者按时间顺序处理
2. 多消费者支持
- 竞争式消费:多个消费者争抢消息处理
- 共享式消费:消费者协同处理消息流
3. 持久化机制
服务异常重启后仍可完整恢复历史消息
4. 消息分组
通过消费组实现灵活的消息分配策略
实现原理
底层结构
采用类日志的存储方式:
- 每个 Stream 包含若干日志段
- 日志段由多个消息组成
- 消息包含:唯一ID、时间戳、消息体等元数据
关键命令
消息流相关命令(生产者 & 查询)
命令 | 作用 | 示例 |
---|---|---|
XADD |
添加消息 | XADD mystream * name 张三 age 18 |
XTRIM |
修剪流,限制长度 | XTRIM mystream MAXLEN 1000 |
XDEL |
删除消息 | XDEL mystream 1607524047165-0 |
XLEN |
获取消息数量 | XLEN mystream |
XRANGE |
获取消息(正向) | XRANGE mystream - + COUNT 10 |
XREVRANGE |
获取消息(反向) | XREVRANGE mystream + - COUNT 10 |
XREAD |
读取消息(非组方式) | XREAD COUNT 10 STREAMS mystream 0 |
消费者组相关命令(消费者)
命令 | 作用 | 示例 |
---|---|---|
XGROUP CREATE |
创建消费者组 | XGROUP CREATE mystream mygroup $ MKSTREAM |
XREADGROUP GROUP |
消费组读消息 | XREADGROUP GROUP mygroup c1 STREAMS mystream > |
XACK |
标记消息已处理 | XACK mystream mygroup 1607524047165-0 |
XGROUP SETID |
设置起始消费ID | XGROUP SETID mystream mygroup 0 |
XGROUP DELCONSUMER |
删除消费者 | XGROUP DELCONSUMER mystream mygroup c1 |
XGROUP DESTROY |
删除消费者组 | XGROUP DESTROY mystream mygroup |
XPENDING |
查看待确认消息 | XPENDING mystream mygroup |
XCLAIM |
声明消息归属权(例如超时后转移) | XCLAIM mystream mygroup c2 60000 1607524047165-0 |
查看信息
命令 | 作用 | 示例 |
---|---|---|
XINFO STREAM |
查看流状态 | XINFO STREAM mystream |
XINFO GROUPS |
查看所有消费者组 | XINFO GROUPS mystream |
XINFO CONSUMERS |
查看某个组下消费者 | XINFO CONSUMERS mystream mygroup |
工作流程
- 消息发布:通过自动生成ID(自然序/UUID)写入日志
- 消费处理 :
- 消费者通过
XREAD(GROUP)
获取消息 - 使用
XACK
确认处理完成
- 消费者通过
- 消费组协同 :
- 组内消费者独立维护消费偏移量
- 支持消息重投机制处理超时/失败场景