redis 实现任务队列
Posted _风的线条
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 实现任务队列相关的知识,希望对你有一定的参考价值。
让生产者使用lpush 命令加入到某个键中,另一个消费者不断使用rpop从该键中取出任务;伪代码:
loop
$task = RPOP queue
if $task
execute($task) # 有就执行
else
wait 1 second ## 等待1 秒
可以使用BRPOP命令来优化上面的代码。
BRPOP 和 RPOP 相似,区别是当列表中没有元素的时候, BRPOP 会一直阻塞住连接,直到有新元素加入
loop
$task = BRPOP queue ,0
execute($task)
BRPOP 接受2个参数,第一个是键名,第二个是超时时间,单位是秒。当超过时间仍没有新元素就返回nil;0表示不限制等待时间,没有新元素就一直阻塞。
redis A > BRPOP queue 0
redis B > LPUSH queue task
优先级队列
BRPOP 可以监听多个键。完整的命令格式为BRPOP key [key...] timeout
.如果所有键都没有值则阻塞,如果多个键都有元素则按照从左到右的顺序取第一个键中的一个元素。利用优先级队列,我们实现将优先消费哪个队列中的任务:
loop
$task = BRPOP queue:confirmation.email,
queue:notifaication.email,
0
execute($task)
发布/订阅模式
包含2种角色:发布者和订阅者
发布者。发布的消息不会持久化,也就是订阅者只能订阅订阅之后的消息
publish channel.1 hi #向 channel.1发送hi消息
订阅者
subscribe channel.1 # 订阅channel.1的消息
unsubscribe channel.1 # 取消订阅,如果不跟参数,则取消所有订阅信息
## 按照规则订阅
psubscribe channel.?* #psubscribe 支持通配符
punsubscribe [pattern [pattern ...]] # 取消订阅,不跟参数,取消所有
以上是关于redis 实现任务队列的主要内容,如果未能解决你的问题,请参考以下文章