Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis pubsub vs阻塞操作_Redis_Publish Subscribe - Fatal编程技术网

Redis pubsub vs阻塞操作

Redis pubsub vs阻塞操作,redis,publish-subscribe,Redis,Publish Subscribe,我应该如何在redis的pubsub和阻塞操作之间进行选择 Redis提供了类似于BLPOP的阻塞操作,该操作将阻塞该操作,直到可以从列表中弹出一个元素。我为什么不使用它来实现PUBSUB的功能呢PUBSUB允许您定义比基本列表级别更高的频道。如果我的用例没有多个通道,那么我可以使用基本的阻塞操作 使用带有阻塞操作的列表和发布/订阅设施之间有一个重要区别 带有阻塞操作的列表可以很容易地用作队列,而发布/订阅通道不涉及任何队列。发布/订阅中涉及的唯一缓冲区与通信有关(即套接字管理)。这意味着当一条

我应该如何在redis的pubsub和阻塞操作之间进行选择


Redis提供了类似于
BLPOP
的阻塞操作,该操作将阻塞该操作,直到可以从列表中弹出一个元素。我为什么不使用它来实现
PUBSUB
的功能呢
PUBSUB
允许您定义比基本列表级别更高的频道。如果我的用例没有多个通道,那么我可以使用基本的阻塞操作

使用带有阻塞操作的列表和发布/订阅设施之间有一个重要区别

带有阻塞操作的列表可以很容易地用作队列,而发布/订阅通道不涉及任何队列。发布/订阅中涉及的唯一缓冲区与通信有关(即套接字管理)。这意味着当一条消息被发布时,它将被尽快传输给订阅者,它永远不会保存在Redis中。结果是,如果订阅者不再侦听Redis套接字,这些订阅者的项目将丢失

另一个重要区别是pub/sub机制可以多播项目。发布项目后,会将其发送给所有订阅者。相反,考虑到Redis中的多个守护进程使用阻塞操作将列表出列,将项目推送到列表将导致该项目由一个且只有一个守护进程出列

阻止列表(即队列)和发布/订阅频道实际上是互补的设施


如果您不需要多播项目,您应该使用带有阻塞操作的列表,因为它们更可靠。

很好的解释。谢谢。我们还可以补充一点,通过Pub/Sub功能,事件的时间戳可以由订阅方(如果有)在接收阶段生成;在阻塞列表的情况下,时间戳应该在有效负载内,这就是为什么我们可能会遇到列表无法实时工作并且时间戳可能丢失的情况