Redis消息通知

2018-06-06  本文已影响0人  守住阳光

一、任务队列

        任务队列顾名思义,就是“传递任务的队列”。与任务队列交互的实体有两类:一类是生产者(producer),一类是消费者(consumer)。生产者会将需要处理的任务放入到任务队列中,而消费者不断地从任务队列中读入任务信息并执行。

        使用任务队列有如下好处:

        1、松耦合

        生产者和消费者都无需知道彼此的实现细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的语言编写。

        2、易于扩展

        消费者可以有多个,而且可以分布在不同的服务器中,借此可以轻易地降低单台服务器的负载。

二、使用redis实现任务队列

        BRPOP命令和RPOP命令相似,唯一的区别是当列表中没有元素时BRPOP命令会一致阻塞住连接,知道有新元素加入。BRPOP命令接收两个参数,第一个是键名,第二个是超时时间,单位是秒。当超过了此时间仍然没有获得新元素的话就返回nil。为0时表示不限制等待时间,即如果没有新元素加入列表就永远阻塞下去。当获得一个元素后会返回两个值,分别是键名和元素值。

三、优先级队列

        BRPOP命令可以同时接收多个键,其完整的命令格式为 BRPOP key [key key ......] timeout 

        如果多个键都有元素则按照从左到右的顺序取第一个键中的元素。借此特性我们可以实现区分优先级的队列。

四、"发布/订阅"模式

         "发布/订阅"模式同样可以实现进程间的通信,其原理如下:

         "发布/订阅"模式中包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。

         发布者发布消息的命令是PUBLISH,用法是PUBLISH channel message 。返回值是接收这条消息的订阅者的数量。发出去的消息不会持久化,也就是说客户端订阅频道后只能收到后续发布到该频道的消息,之前发送的消息就收不到了。可以同时订阅多个频道 SUBCRIE channel [channel  channel .....]。

         执行SUBCRIBE命令后客户端会进入订阅状态,处于此状态的客户端不能使用除了SUBCRIBE,UNSUBCRIBE,PSUBCRIBE,PUNSUBCRIBE这4个属于 "发布/订阅"模式的命令之外的命令。

         进入订阅状态后客户端可能收到三种类型的回复。每种类型的回复都包含3个值:

        (1)、subcribe。表示订阅成功的反馈消息。第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量。

        (2)、message。这个类型的回复是我们最关心的,它表示接收到的消息。第二个值表示产生消息的频道名称,第三个值是消息的内容。

        (3)、unsubcribe。表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道的数量,当此值为0时客户端退出订阅状态,之后就可以执行非" 发布/订阅 "模式的命令了。如果不指定频道会取消订阅所有的频道。

五、按照规则订阅

        除了可以使用SUBCRIBE命令订阅指定的频道外,还可以使用PSUBCRIBE命令订阅指定的规则。规则支持glob风格通配符形式。如:PSUBCRIBE channel.?*。

        规则channel.?*可以匹配channel.1和channel.10。回复包括:第一个值表示这条消息是通过PSUBCRIBE命令订阅频道收到的,第二个值表示订阅时使用的通配符,第三个值表示实际收到消息的频道名称,第四个值是消息内容。

使用PSUBCRIBE命令可以重复订阅一个频道,如客户端执行了PSUBCRIBE  channel.?和PSUBCRIBE channel.?*,这时向channel.2发布消息后该客户端会收到两条消息。

       PUNSUBCRIBE 可以退订指定的规则。

上一篇 下一篇

猜你喜欢

热点阅读