redis使用list做消息队列,为什么推送用lpush,而消费用的是brpop?
最近尝试使用redis做消息队列, 奇怪的是redis使用list做消息队列的话,为什么推送用lpush,而消费用的是brpop?
写代码的时候消费者大致如下:
while(true){
$res = Redis::brpop([key1], $time);
//业务代码
}
我这不是在阻塞检查list中有没有数据么,有数据就进行处理, 这里已经阻塞了, 所以我认为brpop换成rpop貌似也没问题啊, 想知道为什么还要有brpop这么个函数?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
brpop
和rpop
在功能上是有区别的。你的代码里已经透漏了一些信息:
brpop
的第一个参数是一个array
.使用
redis-cli
的话,该命令是这样的brpop
功能:从右到左扫描
key1 ... keyN
,对第一个非空List
进行rpop
操作并返回该值。如果所有List
都是空或不存在,阻塞timeout
秒,timeout
为0
表示一直阻塞。阻塞时,如果有其他client
对key1 ... keyN
中任意一个key
进行push
操作时,阻塞接触并返回。如果超时,则返回nil
。其实就是相当于对多个队列(按照从尾队列
keyN
到头队列key1
)进行rpop
。看你需要不需要 block,根据你需要来定。需要 redis 帮你阻塞,就用 brpop,自己处理队列无数据的情况就用 rpop
你用rpop无阻塞,这个线程将一直进行,你就会发现,单线程也会打满你的CPU