首页/数据/数据库速查/消息方案对比(List / Pub/Sub / Streams)
Redis 运维与场景124 条

消息方案对比(List / Pub/Sub / Streams)

三类方案的可靠性差别巨大:List 简单竞争消费但无 ACK、Pub/Sub 广播不持久、Streams 有消费组/PEL/回溯;按「消息能不能丢」选型。

数据库速查数据更新于 2026-10-13

三种消息方案的可靠性差异

用 Redis 做消息传递有三条常见路线,可靠性差别很大。List 配合阻塞弹出实现竞争消费,简单高效但消息弹出即消失,没有确认机制;Pub/Sub 是纯广播,订阅端不在线时消息直接丢掉;Streams 提供消费者组、待处理列表与回溯读取,能实现确认与重试。选型的核心问题只有一个:这条消息能不能丢。

基本信息

适用平台List 与 Pub/Sub 为 Redis 全版本,Streams 需 5.0+
List 关键命令LPUSH、BRPOP、BRPOPLPUSH、RPOPLPUSH
Pub/Sub 命令PUBLISH、SUBSCRIBE、PSUBSCRIBE
Streams 命令XADD、XREADGROUP、XACK、XAUTOCLAIM
可靠性排序Streams 高于 List 高于 Pub/Sub

典型使用场景

  • 简单异步任务:允许偶发丢失,用 List 最省事
  • 实时通知与广播:订阅端不在线即可丢弃,用 Pub/Sub
  • 订单、支付类异步处理:必须确认与重试,用 Streams
  • 事件总线:多个消费者组各自独立消费同一份消息流
  • 延迟任务与超时重试:依赖 Streams 的待处理列表与空闲时间

三种写法对照

三种写法对照
# List:生产者推入,消费者阻塞弹出
LPUSH jobs job1
BRPOP jobs 30                    # 弹出即消失,失败需自己备份
# 可靠版:弹出后放入备份队列,处理完再删除
BRPOPLPUSH jobs jobs:processing 30
# Pub/Sub:广播,订阅端不在线就丢
PUBLISH notify "deploy done"
SUBSCRIBE notify
# Streams:可确认、可重试、可回溯
XADD orders * id 1
XGROUP CREATE orders g1 0 MKSTREAM
XREADGROUP GROUP g1 c1 COUNT 10 STREAMS orders >
XACK orders g1 1737100000000-0

方案对比

方案投递模型ACK 与重试消息是否会丢
List竞争消费,一条被一个消费者取走无弹出后消费者失败即丢
Pub/Sub广播,在线订阅者都收到无订阅端不在线期间全部丢失
Streams消费组分片,支持回溯有,PEL 与认领机制可确认与重试,可控
混合用法Pub/Sub 通知加 Streams 兜底由 Streams 保证兼顾实时性与可靠性
List 想做到不丢,需要用弹出并放入备份队列的方式:处理成功后再从备份队列删除,处理失败可重新入队,复杂度已接近自己实现一套简化版 Streams。
把 Pub/Sub 当队列使用是常见误解:消息不做持久化,订阅端重启或断线期间的推送无人接收,业务侧表现为「通知偶尔收不到」。

易错点

  • 用 BRPOP 处理不可丢的消息:弹出即消失,消费者崩溃后消息永久丢失
  • 把 Pub/Sub 当可靠队列:订阅端不在线时消息全部丢弃,没有补偿机制
  • List 方案不做备份队列也不做重试:失败任务只能靠人工补单
  • 选型时只比较吞吐不比较可靠性:高峰期的偶发丢失会在对账时集中暴露

数据来源与参考

  • Redis 官方文档: Streams
  • Redis 官方文档: Pub/Sub

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌