Redis-简单实现发布订阅模式

发布订阅模式中有两种角色-发布者和订阅者,它们之间通过频道来做交流,订阅者订阅一个或多个频道,发布者把消息发送到指定的频道,那么所有订阅了该频道的订阅者就都会收到该消息。

发布者通过以下命令发布消息到频道:

 PUBLISH channel message

订阅者通过以下命令订阅频道:

SUBSCRIBE channel [channel …]

启动redis服务,分别开启3个redis-cli实例,然后一个发布者,两个订阅者,订阅者1订阅channel:1channel: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个属于“发布/订阅”模式的命令,使用其他的命令就会报错。

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/108543069