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 实现任务队列的主要内容,如果未能解决你的问题,请参考以下文章

redis 实现任务队列

Redis实现分布式锁与任务队列的思路

Redis入门 - 消息通知

Redis入门 - 消息通知

laravel自带队列和redis实现队列哪个效率高

Flask例子-实现Redis Task Queue(任务队列)