我该如何选择pubsub和redis的阻塞操作?
Redis提供阻塞操作BLPOP
,阻止操作直到可以从列表中弹出元素.为什么我不应该使用它来实现功能PUBSUB
.PUBSUB
允许您定义比基本列表更高级别构造的通道.如果我的用例很简单,没有多个通道,我可以使用基本的阻塞操作.
使用带阻塞操作的列表和发布/订阅设施之间存在重要区别.
具有阻塞操作的列表可以很容易地用作队列,而发布/订阅通道不涉及任何排队.pub/sub中涉及的唯一缓冲区与通信(即套接字管理)有关.这意味着当消息发布时,它将尽快发送给订阅者,它永远不会保存在Redis中.结果是如果订户不再监听Redis套接字,则这些订户的项目将丢失.
另一个重要的区别是pub/sub机制可以组播项目.当项目发布时,它们将被发送给所有订阅者.相反,考虑到多个守护进程使用阻塞操作在Redis中使列表出列,将项目推送到列表将导致项目由一个且仅一个守护进程出列.
阻止列表(即队列)和发布/发布通道实际上是互补的设施.
如果您不需要多播项目,则应该使用带阻塞操作的列表,因为它们更可靠.