redis使用list做消息队列,为什么推送用lpush,而消费用的是brpop?

最近尝试使用redis做消息队列, 奇怪的是redis使用list做消息队列的话,为什么推送用lpush,而消费用的是brpop?
写代码的时候消费者大致如下:
while(true){
$res = Redis::brpop([key1], $time);
//业务代码
}
我这不是在阻塞检查list中有没有数据么,有数据就进行处理, 这里已经阻塞了, 所以我认为brpop换成rpop貌似也没问题啊, 想知道为什么还要有brpop这么个函数?

繁华开满天机
浏览 781回答 3
3回答

潇潇雨雨

brpop 和 rpop 在功能上是有区别的。你的代码里已经透漏了一些信息:brpop 的第一个参数是一个 array. $res = Redis::brpop([key1], $time); 使用 redis-cli 的话,该命令是这样的 > brpop key1 ... keyN timeout brpop 功能:从右到左扫描 key1 ... keyN,对第一个非空 List 进行 rpop 操作并返回该值。如果所有 List 都是空或不存在,阻塞 timeout 秒,timeout 为 0 表示一直阻塞。阻塞时,如果有其他 client 对 key1 ... keyN 中任意一个 key 进行 push 操作时,阻塞接触并返回。如果超时,则返回 nil。 其实就是相当于对多个队列(按照从尾队列 keyN 到头队列 key1)进行 rpop。

摇曳的蔷薇

你用rpop无阻塞,这个线程将一直进行,你就会发现,单线程也会打满你的CPU
打开App,查看更多内容
随时随地看视频慕课网APP