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

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

阅读 10.6k
3 个回答

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

看你需要不需要 block,根据你需要来定。需要 redis 帮你阻塞,就用 brpop,自己处理队列无数据的情况就用 rpop

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏