Table of Contents

一、Redis 发布订阅简介

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。

作为例子, 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

img

除了订阅频道之外,客户端还可以通过执行 PSUBSCRIBE 命令订阅一个或多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会被发送给这个频道的所有订阅者,他还会被发送给所有与这个频道相匹配的模式的订阅者。

二、频道的订阅与退订

数据结构存储:在 redisServer 中的字段 pubsub_channels 存储着所有频道的订阅关系,字典的键为某个被订阅的频道、值是一个链表,里面记录了所有订阅这个频道的客户端。

image-20211209153900094

三、模式的订阅与退订

服务器也将所有模式的订阅关系都保存在服务器状态的 pubsub_patterns 属性里面:

image-20211209154225633

存储案例如下:

  • 客户端 client-7 正在订阅模式 “music.*"。
  • 客户端 client-8 正在订阅模式 “book.*"。
  • 客户端 client-9 正在订阅模式 “news.*"。

image-20211209154416749

四、发送消息

当一个 Redis 客户端执行PUBLISH <channel> <message> 命令将消息 message 发送给频道 channel 的时候,服务器需要执行以下两个动作:

  1. 将消息 message 发送给 channel 频道的所有订阅者。
  2. 如果有一个或多个模式 pattern 与频道 channel 相匹配,那么将消息 message 发送给 pattern 模式的订阅者。

Redis 消息传递:发布订阅模式