一、Redis发布订阅介绍
Redis发布订阅(pub/sub)是一种消息通信模式:发布者(pub)发送消息,订阅者(sub)接收消息。
Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
当有新消息通过 PUBLISH 命令发送给Redis Server时, 这个消息就会被发送给订阅它的三个客户端。
主要命令:
- PUBLISH 发布消息
- SUBSCRIBE 订阅给定的一个或多个频道的信息
- PSUBSCRIBE 订阅一个或多个符合给定模式的频道
- UNSUBSCRIBE 退订一个或多个频道的信息
二、发布/订阅的使用
Redis有两种发布订阅模式:
- 基于频道(channel)的发布订阅
- 基于模式(pattern)的发布订阅
1.基于频道(channel)
底层是通过字典实现的,这个字典就用于保存订阅频道的信息:字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。
- 订阅者订阅消息
127.0.0.1:6379> SUBSCRIBE channelA
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channelA"
3) (integer) 1
- 发布者发布消息
127.0.0.1:6379> PUBLISH channelA hello,world
(integer) 1
订阅者接收到消息
127.0.0.1:6379> SUBSCRIBE channelA
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channelA"
3) (integer) 1
# 订阅者接收到的消息
1) "message"
2) "channelA"
3) "hello,world"
2.基于模式(pattern)
如果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会收到信息。
消息订阅者
127.0.0.1:6379> PSUBSCRIBE luoji.*
消息发送者A发送消息
127.0.0.1:6379> PUBLISH luoji.g403 g403
(integer) 1
消息发送者B发送消息
127.0.0.1:6379> PUBLISH luoji.gpw gpw
(integer) 1
消息订阅者分别收到两个频道的消息
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "luoji.*"
3) (integer) 1
1) "pmessage"
2) "luoji.*"
3) "luoji.g403"
4) "g403"
1) "pmessage"
2) "luoji.*"
3) "luoji.gpw"
4) "gpw"
三、深入理解
-
数据结构
比如说,在下图展示的这个 pubsub_channels 示例中, client2 、 client5 和 client1 就订阅了 channel1 , 而其他频道也分别被别的客户端所订阅:
- 订阅
当客户端调用 SUBSCRIBE 命令时, 程序就将客户端和要订阅的频道在 pubsub_channels 字典中关联起来。
举个例子,如果客户端 client10086 执行命令 SUBSCRIBE channel1 channel2 channel3
,那么前面展示的 pubsub_channels 将变成下面这个样子:
- 发布
当调用 PUBLISH channel message
命令, 程序首先根据 channel 定位到字典的键, 然后将信息发送给字典值链表中的所有客户端。
比如说,对于以下这个 pubsub_channels 实例, 如果某个客户端执行命令 PUBLISH channel1 "hello moto"
,那么 client2 、 client5 和 client1 三个客户端都将接收到 "hello moto" 信息。
- 退订
使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作: 它从 pubsub_channels 字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。