Redis 里有 Pub/Sub,也有 Stream,很多人会把它们都归到“消息”这一类。但它们解决的是两个完全不同的问题。

Pub/Sub 像广播:订阅者在线就收到,不在线就错过;Stream 像日志:消息写进结构里,消费者可以按 ID 读取、确认和重试。

先把机制边界说清楚

这一篇讨论消息语义,不讨论具体客户端封装。关键判断是:你要临时通知,还是要可追溯、可重放、可确认的事件流。

整体路径

Pub/Sub 与 Stream 的语义差异

上面这张图先把主线铺开:一个是在线广播,一个是可追溯日志。读 Redis 这类系统,最重要的是别只停在命令接口,要继续追问它在内存里是什么形状、在主线程上走多远、失败时会留下什么状态。

底层机制

  • Pub/Sub 维护 channel/pattern 到客户端的订阅关系,消息不会为离线客户端保留。
  • 慢消费者会积压输出缓冲,严重时被服务器断开。
  • Stream 把消息写入数据结构,读取位置由客户端或消费组状态维护。
  • Redis Cluster 下还要区分普通 Pub/Sub 和分片 Pub/Sub 的路由范围。

这些机制放在一起看,就能把「这个命令能不能用」改成「这个命令在当前数据规模下还便不便宜」。Redis 的很多坑,不是命令本身错了,而是数据规模和访问方式已经越过了它的舒适区。

取舍与边界

Pub/Sub 轻、快、简单;Stream 重一些,但有状态。把关键订单消息放进 Pub/Sub,是把可靠性寄托在客户端永远在线上。

典型问题:用机制化例子排查

  • 配置广播、在线通知、局部失效消息适合 Pub/Sub。
  • 订单、支付、积分、库存这类需要重试和审计的事件,用 Stream 或专业 MQ。
  • Pub/Sub 要监控输出缓冲,防止慢消费者拖垮连接。
  • Stream 要监控 pending 和裁剪策略,防止消息日志无限增长。

收束:一句判断

广播解决“现在告诉你”,日志解决“以后还能查”。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 Redis」,欢迎关注公众号 「十三Tech」。后续会继续按数据结构、底层机制、持久化、高可用和实战排查这条线更新。

十三Tech公众号二维码