Redis5实现任务队列
原理:使用redis 的集合类型(list) 生产者添加一个元素lpush,消费者不停得取lpop
但是消费者不停的进行取,即使在list为空的时候,这不禁造成了资源浪费...
BRPOP和BLPOP 命令应运而生,BLPOP,BRPOP的区别在与从队列取元素时BLPOP会从队列左边取
BRPOP命令接收两个参数,第一个是键名,第二个是超时时间,单位是秒。
当超过了此时间仍然没有获得新元素的话就会返回nil。
超时时间为0,表示不限制等待的时间,即如果没有新元素加入列表就会永远阻塞下去
127.0.0.1:6379> brpop postsTemp 0 1) "postsTemp" 2) "post:5" 127.0.0.1:6379> brpop postsTemp 0
队列优先级
如果队列中有1小时才能执行完的站内消息推送,在这后面有个注册发送邮件的队列
blpop registerList sendMsg
blpop支持多个参数,这就是按照顺序来弹出,实现了优先级
PHP代码
消费者(每5秒取一次)
$taskKeys=["taskSendMsg","taskRegister"]; while (true){ $info=Redis::brpop($taskKeys,5); dump($info); }
生产者
while (true){ Redis::lpush("taskSendMsg","user1"); Redis::lpush("taskRegister","user2"); sleep(1); }
让我做你的眼睛
说那样你才看的清
!!!