LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

Redis队列如何实现?Redis栈逻辑如何实现

Clicks: 2890 Date: 2014-05-18 22:53:45 Power By 李轩Lane

    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。
©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号