当前位置:嗨网首页>书籍在线阅读

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 命令。