22-发布订阅模式
4.4.4 “发布/订阅”模式
除了实现任务队列外,Redis 还提供了一组命令可以让开发者实现“发布/订阅”(publish/subscribe)模式。“发布/订阅”模式同样可以实现进程间的消息传递,其原理是这样的:
“发布/订阅”模式中包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。
发布者发布消息的命令是 PUBLISH ,用法是 PUBLISH channel message ,如向 channel.1 说一声“ hi ”:
redis> PUBLISH channel.1 hi (integer) 0
这样消息就发出去了。 PUBLISH 命令的返回值表示接收到这条消息的订阅者数量。因为此时没有客户端订阅 channel.1 ,所以返回0。发出去的消息不会被持久化,也就是说当有客户端订阅 channel.1 后只能收到后续发布到该频道的消息,之前发送的就收不到了。
订阅频道的命令是 SUBSCRIBE ,可以同时订阅多个频道,用法是 SUBSCRIBE channel [channel …] 。现在新开一个redis-cli实例 A ,用它来订阅 channel.1 :
redis A> SUBSCRIBE channel.1 Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel.1"
3) (integer) 1
执行 SUBSCRIBE 命令后客户端会进入订阅状态,处于此状态下客户端不能使用除 SUBSCRIBE 、 UNSUBSCRIBE 、 PSUBSCRIBE 和 PUNSUBSCRIBE 这4个属于“发布/订阅”模式的命令之外的命令(后面3个命令会在下面介绍),否则会报错。
进入订阅状态后客户端可能收到3种类型的回复。每种类型的回复都包含 3 个值,第一个值是消息的类型,根据消息类型的不同,第二、三个值的含义也不同。消息类型可能的取值有以下3个。
(1) s ubscribe 。表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量。
(2) message 。这个类型的回复是我们最关心的,它表示接收到的消息。第二个值表示产生消息的频道名称,第三个值是消息的内容。
(3) unsubscribe 。表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,当此值为0时客户端会退出订阅状态,之后就可以执行其他非“发布/订阅”模式的命令了。
上例中当实例 A 订阅了 channel.1 进入订阅状态后收到了一条 subscribe 类型的回复,这时我们打开另一个redis-cli实例 B ,并向 channel.1 发送一条消息:
redis B> PUBLISH channel.1 hi! (integer) 1
返回值为1表示有一个客户端订阅了 channel.1 ,此时实例 A 收到了类型为 message 的回复:
1) "message"
2) "channel.1"
3) "hi!"
使用 UNSUBSCRIBE 命令可以取消订阅指定的频道,用法为 UNSUBSCRIBE [channel [channel …]] ,如果不指定频道则会取消订阅所有频道5。
5由于redis-cli的限制我们无法在其中测试 UNSUBSCRIBE 命令。