跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

广播

Redis Pub/Sub 把消息推送给发布时已连接的订阅,不为其他任何人保留。

Pub/Sub:一次发布到达此刻已连接的订阅,各自经过其客户端的缓冲区发布者PUBLISH news频道 news什么也不保留订阅 A已连接订阅 B已连接之后才订阅:永远收不到客户端缓冲区默认 32 条处理器处理器跟不上缓冲区时,最旧的消息会丢失
以文字阅读本图
  1. 发布者 PUBLISH news → 频道 news 什么也不保留: 发布
  2. 频道 news 什么也不保留 → 订阅 A 已连接
  3. 频道 news 什么也不保留 → 订阅 B 已连接
  4. 订阅 A 已连接 → 客户端缓冲区 默认 32 条
  5. 客户端缓冲区 默认 32 条 → 处理器
  6. 之后才 订阅: 永远收不到
  7. 处理器跟不上缓冲区时, 最旧的消息会丢失

频道是一个名字,不是键:Redis 不在它下面存储任何东西。PUBLISH 把消息推送给此刻订阅了该频道的每个客户端。Redis 称之为至多一次投递:没有订阅或断开了连接的客户端,永远收不到这条消息(Pub/Sub)。

每个 RedisPubSub 订阅都打开一个自己的客户端,并用它订阅。启动时,经典订阅的订阅步骤要等同一连接上紧随 SUBSCRIBE 发出的 PING 得到应答后才完成,因此订阅打开之后发布的消息都会到达它。RedisPubSubPattern 用 PSUBSCRIBE 订阅一个 glob 模式,接收与之匹配的每个频道。

消息在客户端的缓冲区里等待,直到处理器取走它。缓冲区容纳 32 条消息,这是 fred 的默认值,buffer 可以设置别的大小。落后的订阅会丢失最旧的消息,并记录一条警告,写明频道和丢失的条数。

经典 Pub/Sub 把每条消息发送到集群的每个节点。分片 Pub/Sub 自 Redis 7.0 起提供,命令是 SSUBSCRIBE 和 SPUBLISH:它把频道分配给一个哈希槽,消息只留在该分片之内。PubSubMode 选择其中一种,一种模式下的订阅收不到另一种模式下发布的消息。

Pub/Sub 投递没有什么需要结算:ack 和 nack 返回 AckError::Unsupported。