标签 栈 下的文章

Redis是天生的队列好手。RPOP,LPUSH就可以看到。生产者是队列任务的提出方,消费者队列任务的执行方。生产者提出大量的任务,他们排队一个接一个的被消费者执行。执行一个就RPOP,提出一个新任务就LPUSH。如果要插队呢?就RPUSH。Redis队列的伪代码:

//无限循环
loop
    $task = RPOP queue
    if($task)
        execute($task)
    else
        sleep(1)

一个无限循环,从队列的最头部弹出一个任务,如果该任务存在则执行,如果不存在则睡眠,1秒后再次进入循环。这段代码实现了对队列任务的死循环来进行监听任务列表。这样并不好,每1秒扫描一次,如果一晚上都没有呢,那不是在白白浪费资源吗。这时候借助Redis 队列命令家族中的BRPOP。如果队列列表中有任务则弹出,如果没有任务就一直将连接阻塞,直到有新的任务加入才会放开。

//无限循环
loop
    $task = BRPOP queue 0
    execute($task)

BRPOP第一个参数是键,第二个参数是时间,如果时间为0则没有新任务加入的时候永久阻塞。
Redis队列家族是可以进行优先级的。比如有三个列表任务列表,queue1,queue2,queue3。那么那个优先级高就拍在前面:

    BRPOP queue2 queue3 queue1 0

如果队列2中有任务则优先弹出任务2。