美文网首页
Redis消息通知

Redis消息通知

作者: 守住阳光 | 来源:发表于2018-06-06 19:00 被阅读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 可以退订指定的规则。

    相关文章

      网友评论

          本文标题:Redis消息通知

          本文链接:https://www.haomeiwen.com/subject/xgfisftx.html