Redis Pub/Sub 与 Redis Streams

发布: (2025年12月22日 GMT+8 23:37)
6 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将为您翻译成简体中文。

什么是 Redis Pub/Sub 和 Redis Streams?

Redis Pub/Sub — 发送即忘的消息

发布者向 频道 发送消息。
订阅者仅在发布时保持连接才会收到消息。
没有消息存储、重试或回放机制。

关键特性

Feature(特性)Pub/Sub
Message persistence(消息持久化)❌ 否
Delivery guarantee(投递保证)At‑most‑once(至多一次)
Offline consumption(离线消费)❌ 否
Consumer groups(消费者组)❌ 否
Ordering(顺序)Best effort(尽力而为)
Complexity(复杂度)Very low(非常低)

何时适合使用 Pub/Sub

  • 实时 UI 更新(仪表盘、实时光标、在线状态)
  • 对漏掉消息可接受的聊天系统
  • 向已连接客户端广播系统状态

核心限制

如果订阅者断开、响应慢或崩溃,消息将永久丢失

Redis Streams — 持久化事件日志

Redis Streams 引入了 持久化、追加式日志,用于可靠的事件处理。消息存储在 Redis 中,消费者可以按自己的节奏消费。

核心概念

  • Stream(流) – 有序的消息日志
  • Message ID(消息 ID) – 单调递增的唯一标识符
  • Consumer Group(消费者组) – 跨多个消费者的协同消费
  • ACK – 确认成功处理
  • PEL(Pending Entries List,待处理条目列表) – 跟踪未确认的消息

关键特性

Feature(特性)Streams
Message persistence(消息持久化)✔ 是
Delivery guarantee(投递保证)At‑least‑once(至少一次)
Offline consumption(离线消费)✔ 是
Consumer groups(消费者组)✔ 是
Replay(回放)✔ 是
Complexity(复杂度)Medium–High(中等偏高)

何时适合使用 Streams

  • 作业队列和后台工作者
  • 事件驱动的微服务
  • 审计日志和事件溯源
  • 需要恢复和重试的系统

并排比较

Aspect(方面)Pub/SubStreams
Persistence(持久化)No(否)Yes(是)
Replay(回放)No(否)Yes(是)
ACK support(ACK 支持)No(否)Yes(是)
Consumer groups(消费者组)No(否)Yes(是)
Failure recovery(故障恢复)No(否)Yes(是)
Latency(延迟)Very low(极低)Low–medium(低至中)
Operational complexity(运维复杂度)Minimal(最小)Moderate(适中)

Pub/Sub 的内部工作原理

  1. 订阅者连接并订阅频道。
  2. 发布者发布消息。
  3. Redis 会立即将消息推送给所有活跃的订阅者。

如果订阅者在此时未连接,消息将被丢弃。没有 无背压处理无消息历史

Redis Streams 的内部工作原理

# Producer appends a message
XADD mystream * field1 value1 field2 value2

# Consumer reads messages (group mode)
XREADGROUP GROUP mygroup consumer1 COUNT 10 STREAMS mystream >

# Consumer acknowledges processing
XACK mystream mygroup 1526985054069-0
  • Redis 使用唯一 ID 存储消息。
  • 消费者使用 XREADXREADGROUP 读取消息。
  • 未确认的消息会保留在 PEL(Pending Entries List)中以便恢复。

Streams 的行为类似于 Kafka 或 SQS,但完全嵌入在 Redis 中。

交付保证说明

Pub/Sub — 最多一次

  • 消息的投递次数为零次或一次。
  • 不会重试,也没有确认。
  • 最适合非关键数据。

Streams — 至少一次

  • 消息会被持久化。
  • 处理可以重试。
  • 消费者必须处理可能的重复。

扩展考虑

Pub/Sub

  • 极快。
  • 最小的内存开销。
  • 随着订阅者数量增加,扇出成本上升。

Streams

  • 更高的内存使用。
  • 消费者组分配负载。
  • 支持水平扩展和容错。

决策规则(在实际项目中使用)

场景推荐选择
仅实时通知Pub/Sub
业务关键处理Streams
UI 事件Pub/Sub
分布式工作者Streams
需要回放或恢复Streams
最小延迟,无历史Pub/Sub

实际案例

通知

  • 只有在线用户才重要 → Pub/Sub
  • 每个用户都必须收到消息 → Streams

订单处理流水线

  • 库存、计费、发货协调 → Streams

常见错误

  • 将 Pub/Sub 用作作业队列 ❌
  • 期望 Pub/Sub 具备持久性 ❌
  • 在 Streams 中忽视重复处理 ❌
  • 从不修剪旧的流条目 ❌

摘要

Redis 提供两种消息模型:

  • Pub/Sub — 简单、快速、瞬时
  • Streams — 持久、可靠、可回放

根据 投递保证容错能力系统复杂度 来选择,而不是便利性。

经验法则

  • 可以接受消息丢失 → Pub/Sub
  • 不能接受消息丢失 → Streams

进一步阅读

Back to Blog

相关文章

阅读更多 »