Redis Pub/Sub和Redis Stream之间的主要区别是什么?

49

每种方法的优缺点是什么? 请指导何时使用其中一种而不是另一种。

1个回答

94

数据存储

Pub/Sub是一个发布/订阅平台,不是数据存储。发布的消息会消失,无论是否有订阅者。

在Redis Streams中,流是一种数据类型,是一种独立的数据结构。消息或条目存储在内存中,并保留直到被命令删除。

同步/异步通信(推送/拉取)

Pub/Sub是同步通信(推送协议)。所有参与方需要同时活跃才能进行通信。在这里,Redis是一个纯同步的消息代理。

Redis Streams允许同步(使用XREADBLOCK以及特殊的$ ID是推送协议)和异步通信(常规XREAD拉取协议)。XREADBLOCK类似于Pub/Sub,但具有在断开连接时恢复而不丢失消息的能力。

传递语义

Pub/Sub是最多一次,即“发送并忘记”。

Redis Streams允许最多一次或至少一次(接收方发送显式确认)。

消费者的阻塞模式

Pub/Sub仅支持阻塞模式。一旦订阅了频道,客户端就会进入订阅者模式,无法发出命令(除了[P]SUBSCRIBE[P]UNSUBSCRIBEPINGQUIT),它已经变成只读模式。

Redis Streams允许消费者以阻塞模式或非阻塞模式读取消息。

扇出

发布/订阅只能进行扇出操作,所有活跃客户端都会接收到所有消息。

Redis Streams允许进行扇出操作(使用XREAD),也可以将同一流的不同子集提供给多个客户端。这样可以通过将不同的消息路由到不同的工作进程来缩放消息处理,而不可能将同一消息传递给多个消费者。通过消费者组实现了最后一个场景。


Redis Streams提供了许多其他功能,如时间戳、字段-值对、范围等。但这并不意味着您应该总是选择Streams。如果您的用例可以使用发布/订阅来实现,则最好使用发布/订阅。在使用Streams时,您需要关注内存使用情况。


非常好的回答!有两个小问题:1. 由于Redis在宕机时可能会丢失数据,因此Redis Stream无法保证至少一次。2. 当客户端订阅频道时,仍然可以发出一些命令,例如UNSUBSCRIBE、PING、QUIT等。 - for_stack
3
谢谢你最近在这里提供的帮助,包括这次以及其他方面的帮忙 :) - Itamar Haber
1
@MarcusSmith 这是关于 Redis Pub Sub 的,不是关于 Google Pub Sub 的。 - LeoMurillo
1
或者可以考虑使用Google Pub/Sub(因为它解决了一些问题)。1.即使数据没有被确认,也不会“自动消失”。它在7天后过期,适用于高容量通信层。2.Google Pub/Sub是至少一次性的,并具有SLA以确保这一点。3.Google Pub/Sub还具有过滤功能,以便订阅者不会收到所有内容。最终,Redis不仅仅是一个通信层,根据您的需求提供不同的选项,而Google Pub/Sub则是一个非常好的通信层,仅此而已。请参见Google Pub/Sub - Marcus Smith
1
就像观察到的那样@LeoMurillo,数据丢失在很大程度上取决于Redis的配置。有多个选项:AOF、快照、Active-Active或主/从集群、Redis闪存等,可以让您控制数据复制以满足应用程序的特定容错需求。 - InfoSponge
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接