文章目录
-
- 核心概念
- Redis命令实操
-
- [1、XADD 生产消息(发送消息)](#1、XADD 生产消息(发送消息))
- [2、XGROUP 创建消费者组](#2、XGROUP 创建消费者组)
- [3、XREADGROUP 消费消息(组内消费者拉消息)](#3、XREADGROUP 消费消息(组内消费者拉消息))
- [4、XACK 确认消息(业务处理成功,通知redis)](#4、XACK 确认消息(业务处理成功,通知redis))
- [5、XPENDING 查看pending里未ACK消息(排查故障用)](#5、XPENDING 查看pending里未ACK消息(排查故障用))
- 6、补充:读取pending里卡住的消息(故障恢复)
- 命令小结(只记这5个核心,其余不用记)
核心概念
Redis Stream 就是 Redis 专门做消息流的数据结构,本质是一个追加式的消息日志。
4个核心名词
- Stream流 :消息容器,类似一个消息表,消息只能往尾部追加 。
- key就是stream的名字,比如:
stream.order
- key就是stream的名字,比如:
- 消息ID :格式:
毫秒时间戳-序号,例如:1766188000000-0。- 自动生成,全局有序,唯一标识一条消息。
- 消费者组 Consumer Group(⭐最重要)
- 给一个stream创建一组消费者,消息只会发给组内其中一个消费者(负载均衡)
- 核心机制:消息被读取之后,不会直接删除,进入
pending-list(待确认列表)
- ACK确认 :业务处理成功后,手动调用XACK ,告诉Redis这条消息消费完成; 如果没ACK :消息一直留在pending,消费者宕机后,其他消费者可以接管这条消息,防止消息丢失
对比:
- XREAD:普通读取,没有消费者组,
读完消息不会进pending,宕机容易丢消息,生产不用。- XREADGROUP:消费者组读取,秒杀项目用这个!
一句话工作流程:
生产者 XADD 发送消息到stream → 消费者组里的消费者XREADGROUP拉消息 → 业务处理订单 → 成功后XACK确认。
如果处理失败/服务崩溃,消息留在pending,可以重新消费。
Redis命令实操
1、XADD 生产消息(发送消息)
java
"语法":XADD 流名 * key1 value1 key2 value2
"*":代表,让redis自动生成,消息id
XADD stream.seckill * userId 10086 voucherId 1001
返回:1766188000000-0(消息id)
-
可选参数:限制 stream 最大消息数量,防止无限堆积
javaXADD stream.seckill MAXLEN ~ 1000 * userId 10086 voucherId 1002MAXLEN ~ 1000:消息超过1000条,自动裁剪旧消息,避免Redis内存打爆
2、XGROUP 创建消费者组
必须先建组,才能XREADGROUP
java
创建消费者组g1,
绑定stream.seckill,
$代表从【最新消息】开始消费
XGROUP CREATE stream.seckill g1 $ MKSTREAM
$:只消费创建组之后新产生的消息,旧消息忽略(秒杀场景用这个)MKSTREAM:如果stream不存在,自动创建stream,不用手动建>
注意:同一个流,同一个消费者组,只需要创建一次,重复执行会报错。
3、XREADGROUP 消费消息(组内消费者拉消息)
java
组g1,
消费者c1,
读取stream.seckill,
COUNT 1:一次拿一条
> 代表,读取从未被消费过的新消息,
XREADGROUP GROUP g1 c1 COUNT 1 STREAMS stream.seckill >
>:只拿没有被读取过的新消息(日常消费用这个)- 消费者名字c1 可以随便写,Redis自动识别,同一个组不同消费者实现负载均衡
4、XACK 确认消息(业务处理成功,通知redis)
java
流名,组名,消息id
XACK stream.seckill g1 1766188000000-0
- ACK之后,这条消息就从pending列表移除。不ACK,消息会一直挂在pending
5、XPENDING 查看pending里未ACK消息(排查故障用)
java
XPENDING stream.seckill g1
可以看到哪些消息没确认、被哪个消费者持有、挂了多久。
场景:消费者宕机,消息卡在pending,重启后可以重新读取pending消息,做失败重试。
6、补充:读取pending里卡住的消息(故障恢复)
java
读取 pending里的消息,把 > 改成 0
XREADGROUP GROUP g1 c1 COUNT 1 STREAMS stream.seckill 0
命令小结(只记这5个核心,其余不用记)
XADD发消息 | XGROUP CREATE建消费组 | XREADGROUP拉消息 | XACK确认 | XPENDING查看未确认