最近尝试使用redis做消息队列, 奇怪的是redis使用list做消息队列的话,为什么推送用lpush,而消费用的是brpop?
写代码的时候消费者大致如下:
while(true){
$res = Redis::brpop([key1], $time);
//业务代码
}
我这不是在阻塞检查list中有没有数据么,有数据就进行处理, 这里已经阻塞了, 所以我认为brpop换成rpop貌似也没问题啊, 想知道为什么还要有brpop这么个函数?
最近尝试使用redis做消息队列, 奇怪的是redis使用list做消息队列的话,为什么推送用lpush,而消费用的是brpop?
写代码的时候消费者大致如下:
while(true){
$res = Redis::brpop([key1], $time);
//业务代码
}
我这不是在阻塞检查list中有没有数据么,有数据就进行处理, 这里已经阻塞了, 所以我认为brpop换成rpop貌似也没问题啊, 想知道为什么还要有brpop这么个函数?
4 回答13.2k 阅读✓ 已解决
5 回答7.7k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答1.5k 阅读✓ 已解决
1 回答950 阅读✓ 已解决
3 回答1.2k 阅读
1 回答1.4k 阅读
brpop
和rpop
在功能上是有区别的。你的代码里已经透漏了一些信息:
brpop
的第一个参数是一个array
.使用
redis-cli
的话,该命令是这样的brpop
功能:从右到左扫描
key1 ... keyN
,对第一个非空List
进行rpop
操作并返回该值。如果所有List
都是空或不存在,阻塞timeout
秒,timeout
为0
表示一直阻塞。阻塞时,如果有其他client
对key1 ... keyN
中任意一个key
进行push
操作时,阻塞接触并返回。如果超时,则返回nil
。其实就是相当于对多个队列(按照从尾队列
keyN
到头队列key1
)进行rpop
。