发布订阅模式中有两种角色-发布者和订阅者,它们之间通过频道来做交流,订阅者订阅一个或多个频道,发布者把消息发送到指定的频道,那么所有订阅了该频道的订阅者就都会收到该消息。
发布者通过以下命令发布消息到频道:
PUBLISH channel message
订阅者通过以下命令订阅频道:
SUBSCRIBE channel [channel …]
启动redis服务,分别开启3个redis-cli实例,然后一个发布者,两个订阅者,订阅者1订阅channel:1,channel:2这两个频道,订阅者2订阅channel:2频道,如下:
首先可以看到订阅者订阅频道后,有返回结果。
这里解释先下返回结果,返回结果的类型大致分为3种,每种类型都会包含3个值,这里的类型是订阅,参考上图返回的结果:
第一个值表示消息的类型,这里是订阅,所以值为subscribe。
第二个值根据消息类型的不同,表示的意思也不同,这里表示订阅成功的频道名称。
第三个值是当前客户端订阅的频道数量,所以订阅者1才会返回2,因为它订阅了两个频道。
发布者向channel:1频道发布消息,看下订阅者们的反应,如下:
发现订阅者1有消息返回,而订阅者2没有,这是因为订阅者2没有订阅channel:1频道,再让发布者向channel:2频道发布消息,订阅者们的反应如下:
这时可以先看看发布者,之前向channel:1频道发布消息时,返回结果1,这次向channel:2频道发布消息时,返回结果2,想想两个频道都有几个订阅者,就可以知道该结果表示的是接收到这条消息的订阅者数量。
可以发现发布者向channel:2频道发布的的消息,订阅者1和订阅者2都能收到,参考上图解释下返回结果:
第一个值表示消息的类型,这里表示接收到的消息,所以值为message。
第二个值根据消息类型的不同,表示的意思也不同,这里表示产生消息的频道名称。
第三个值表示消息的内容。
可以订阅自然就能取消,取消订阅的命令如下:
UNSUBSCRIBE [channel [channel …]]
如果不指定具体的频道参数,那就会取消对所有频道的订阅。
不过该命令由于redis-cli的限制,测试不了效果,所以就简单的说下返回结果的3个值代表的意思:
第一个值表示成功取消订阅某个频道。
第二个值表示对应的频道名称。
第三个值表示当前客户端订阅的频道数量,一旦这个值变为0,客户端就会退出订阅状态。
PS:什么是订阅状态?
一旦客户端订阅了某个或某些频道,就会进入订阅状态,订阅状态下的客户端只能使用SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE和PUNSUBSCRIBE这4个属于“发布/订阅”模式的命令,使用其他的命令就会报错。