为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

brpoprpop 在功能上是有区别的。
你的代码里已经透漏了一些信息:brpop 的第一个参数是一个 array.

$res = Redis::brpop([key1], $time);

使用 redis-cli 的话,该命令是这样的

> brpop key1 ... keyN timeout

brpop 功能:
从右到左扫描 key1 ... keyN,对第一个非空 List 进行 rpop 操作并返回该值。如果所有 List 都是空或不存在,阻塞 timeout 秒,timeout0 表示一直阻塞。阻塞时,如果有其他 clientkey1 ... keyN 中任意一个 key 进行 push 操作时,阻塞接触并返回。如果超时,则返回 nil

其实就是相当于对多个队列(按照从尾队列 keyN 到头队列 key1)进行 rpop

查看完整回答
反对 回复 2019-03-18
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

你用rpop无阻塞,这个线程将一直进行,你就会发现,单线程也会打满你的CPU

查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 780 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信