文章目录加载中

Redis 实现任务队列

# redis 实现任务队列

# 使用列表

借助 redis 的列表来模拟任务队列的伪代码:

# 无限循环读取任务队列中的内容
loop
    $task = RPOR queue
    if $task
        # 如果任务队列中有任务则执行它
        execute($task)
    else
        # 如果没有则等待 1 秒以免过于频繁地请求数据
        wait 1 second

这种主动轮询的方式实现简单,但是无限循环,不论是会否有任务,不停的调用 PROP 命令,浪费 CPU 计算资源。

# 改进:使用阻塞命令

改进方法将其换成阻塞式。借助 BPROP 命令,会等到 queue 中有数据的时候,才会继续执行。这里类似 c#和 javascript 中的 await/async 语法。

伪代码如下:

loop
    $task = BRPOR queue 0 # 第2个参数是超时时间,填0是一直等待直到有值入队
    if $task
        execute($task)
    else
        wait 1 second

# redis 实现优先级队列

BRPOP 命令可以同时接收多个键,其完整的命令格式为 BLPOP key [key …] timeout,如 BLPOP queue:1 queue:2 0。意义是同时检测多个键,如果所有键都没有元素则阻塞,如果其中有一个键有元素则会从该键中弹出元素。

如果 queue:1 和 queue:2 均有值,那么按照从左到右的顺序弹出。借助这个特性,可以开辟多个不同优先级的队列,例如 queue:1、queue:2、queue:3 等等,按照从大到小的优先级,伪代码如下:

loop
    $task = BRPOR queue:3 queue:2 queue:1 0 # 第2个参数是超时时间,填0是一直等待直到有值入队
    if $task
        execute($task)
    else
        wait 1 second
本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog