Redis:发布/订阅(pub/sub)
跳到导航
跳到搜索
关于
SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH 三个命令实现了发布与订阅信息泛型(Publish/Subscribe messaging paradigm),在这个实现中: 1、发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。 2、发送者无须知道任何关于订阅者的信息,而订阅者也无须知道是那个客户端给它发送信息,它只要关注自己感兴趣的频道即可。 对发布者和订阅者进行解构(decoupling), 可以极大地提高系统的扩展性(scalability), 并得到一个更动态的网络拓扑(network topology)。
发布订阅(pub/sub)是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接收消息。
“发布订阅”与“消息队列”
发布订阅也叫“生产者消费者”模式,是实现“消息队列”的一种方式。基于消息队列,可以实现系统解耦、削峰填谷,顶住流量洪峰。
- redis 的主业目前是基于键值对的数据存储、缓存等,消息队列可能是 redis 的一种尝试;
- 常用的流行的消息队列有:“ActiveMQ”、“RabbitMQ”等;
消息队列的三要素:
- 生产者(producer)
- 消费者(consumer)
- 消息服务(broker)
发布和订阅
正在订阅频道的客户端不应该发送除下述之外的其他命令:
命令 | 描述 | |
---|---|---|
订阅频道 | SUBSCRIBE channel [channel ...] | 订阅给定的一个或多个频道的信息。 |
UNSUBSCRIBE [channel [channel ...]] | 退订给定的频道。 | |
订阅模式 | PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合给定模式的频道。 |
PUNSUBSCRIBE [pattern [pattern ...]] | 退订所有给定模式的频道。 | |
发布 | ||
PUBLISH channel message | 将信息发布到指定的频道。 | |
状态 | PUBSUB subcommand [argument [argument ...]] | 查看订阅与发布系统状态。 |
- 客户端订阅的模式里面可以包含多个 glob 风格的通配符, 比如: * 、 ? 和 [...],等等。
- 在执行 SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE 和 PUNSUBSCRIBE 命令时,返回结果的最后一个元素是客户端目前仍在订阅的频道和模式总数。
- 当客户端退订所有频道和模式,也即是这个总数值下降为 0 的时候,客户端将退出订阅与发布状态。
订阅频道
// 订阅
subscribe <channel> [<channel> ...]
// 发布
publish <channel> <message>
(以命令行模拟实现):
- 开启 4 个 redis 客户端(“./redis-cli”),如上图,3 个客户端作为消息订阅者,1 个为消息发布者:
- 让 3 个消息订阅者订阅某个频道主题:“
subscribe channelTest
”; - 让 1 个消息发布者向频道主题上发布消息:“
publish channelTest message123
”;
订阅模式
// 订阅
psubscribe <pattern> [<pattern> ...]
// 发布
publish <channel> <message>
(以命令行模拟实现):
信息的格式
FAQ
通过频道和模式接收同一条信息
如果客户端订阅的多个模式匹配了同一个频道,或者客户端同时订阅了某个频道、以及匹配这个频道的某个模式,那么它可能会多次接收到同一条信息。
示例:
- 如果客户端执行了以下命令:
SUBSCRIBE foo PSUBSCRIBE f*
- 当有信息发送到频道 foo 时,客户端将收到两条信息:一条来自频道 foo,信息类型为 message;另一条来自模式 f*,信息类型为 pmessage 。