一、任务队列
任务队列顾名思义,就是“传递任务的队列”。与任务队列交互的实体有两类:一类是生产者(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 可以退订指定的规则。
网友评论