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

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

传输方式

Redis 用三种方式传递消息:流为消费者组保留条目,列表把每个条目交给一个消费者,频道什么也不保留。

生产者写入流、列表和频道,每种传输方式把消息交给读取者的方式各不相同XADDLPUSHPUBLISH流保留每个条目列表直到被弹出频道什么也不保留组billing组audit消费者轮流读取客户端A客户端B之后才加入:永远收不到每个组都读取每个条目每个条目只交给一个消费者
以文字阅读本图
  1. XADD → 流 保留每个条目
  2. LPUSH → 列表 直到被弹出
  3. PUBLISH → 频道 什么也不保留
  4. 流 保留每个条目 → 组 billing
  5. 流 保留每个条目 → 组 audit
  6. 列表 直到被弹出 → 消费者 轮流读取
  7. 频道 什么也不保留 → 客户端 A
  8. 频道 什么也不保留 → 客户端 B
  9. 之后才加入: 永远收不到
  10. 每个组都读取 每个条目
  11. 每个条目只交给 一个消费者

流是只追加的日志。XADD 以服务器分配的 id 追加一个条目,条目一直保留到流被裁剪为止。消费者组用自己的游标读取流,因此两个组各自收到每个条目。在同一个组内,每个条目只交给一个消费者。消费者组一页用图说明:组如何跟踪它投递过的条目。

列表是一个队列。生产者用 LPUSH 推入,消费者从另一端弹出,弹出的条目就从 Redis 中消失了。队列一页用图说明:可靠列表如何把条目一直保留到处理器结算它为止。

频道不存储任何东西。PUBLISH 把消息推送给此刻已订阅的客户端,之后才订阅的客户端永远收不到它。广播一页用图说明了这一点。

服务通过各自的描述符读取每种传输方式:RedisStream、RedisList 和 RedisPubSub。三者的处理器都是同一个 #[subscriber] 函数。确认的含义各不相同,结算一页用图说明了这一点。