redis stream

文章目录




核心概念

Redis Stream 就是 Redis 专门做消息流的数据结构,本质是一个追加式的消息日志。

4个核心名词

  1. Stream流 :消息容器,类似一个消息表,消息只能往尾部追加 。
    • key就是stream的名字,比如:stream.order
  2. 消息ID :格式:毫秒时间戳-序号 ,例如:1766188000000-0。
    • 自动生成,全局有序,唯一标识一条消息。
  3. 消费者组 Consumer Group(⭐最重要)
    • 给一个stream创建一组消费者,消息只会发给组内其中一个消费者(负载均衡)
    • 核心机制:消息被读取之后,不会直接删除,进入 pending-list(待确认列表)
  4. 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 最大消息数量,防止无限堆积

    java 复制代码
    XADD  stream.seckill  MAXLEN ~ 1000  *  userId 10086  voucherId 1002

    MAXLEN ~ 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查看未确认

相关推荐
爱吃牛肉的大老虎2 小时前
Redis之分布式 Session问题
数据库·redis·分布式
java_nnnn2 小时前
数据库读写分离与 Redis 缓存:从 MySQL 查询压力到缓存机制
数据库·redis·缓存
hweiyu002 小时前
Redis命令:SCARD
redis·缓存
OxYGC3 小时前
[工程] Redis 配置文件redis.conf全解析
数据库·redis·bootstrap
夕除19 小时前
redis--数据类型 string list
redis
一条泥憨鱼19 小时前
【Redis | 黑马点评】分布式锁;Lua脚本;Redisson与看门狗 |源码万字详解
redis·分布式·lua
stark张宇20 小时前
库存扣减的“锁”事:悲观锁、乐观锁、分布式锁
redis·分布式·mysql
Sayuanni%31 天前
Redis(初阶)
数据库·redis·缓存
未秃头的程序猿1 天前
一次重复扣款的复盘:分布式锁加错了维度,比不加锁更危险
java·redis·后端