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

发布于 2022-09-05 10:48:19 字数 251 浏览 22 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

迟到的我 2022-09-12 10:48:20

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

握住你手 2022-09-12 10:48:20

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

§普罗旺斯的薰衣草 2022-09-12 10:48:20

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文