Redis:发布是异步的吗?

Redis:发布是异步的吗?,redis,publish-subscribe,Redis,Publish Subscribe,如果我PUBLISH在Redis上有一个订阅者,但该订阅者需要1秒才能收到消息,则会阻止PUBLISH1秒,或者他们独立行动 如果它们独立运行,在坏消息开始发生之前,有多少PUBLISH命令将排队?PUBLISH是同步的-您也可以在pubsub.c函数publishCommand和pubsubPublishMessage中找到此命令的来源。Redis是单线程应用程序。因此,严格来说,他的所有命令都是同步的 不要认为答案或评论很清楚。 从使用redis客户端的外部调用方的角度来看,如果我有一个背对

如果我
PUBLISH
在Redis上有一个订阅者,但该订阅者需要1秒才能收到消息,则会阻止
PUBLISH
1秒,或者他们独立行动


如果它们独立运行,在坏消息开始发生之前,有多少
PUBLISH
命令将排队?

PUBLISH
是同步的-您也可以在pubsub.c函数
publishCommand
pubsubPublishMessage
中找到此命令的来源。Redis是单线程应用程序。因此,严格来说,他的所有命令都是同步的

不要认为答案或评论很清楚。 从使用redis客户端的外部调用方的角度来看,如果我有一个背对背运行的线程/进程,那么我会订阅一个通道,然后立即写入同一个通道,并测试它是否收到回显消息。在客户端响应并开始写入第一条消息时,是否有可能出现竞争条件b/c订阅未完全注册或完成


也许core redis server同时支持这两种功能,这取决于所使用的客户端,但不确定……

我认为这不是真的。我很确定Redis使用的是非阻塞IO并将发布排队发送给客户端,而不是在每个慢用户上进行阻塞。根据Redis文档,“发布的消息被描述为通道,而不知道可能有什么(如果有的话)订阅者”。我真的怀疑它是否会等待订阅者的回应。每个订阅者,它该等谁?至少一个?如果其中一个挂起,则整个实例都已挂起?我不这么认为。@ArturBiesiadowski出版是同步的。它是迭代抛出所有订阅者列表并逐个向他们发送事件。是的,网络层是非阻塞IO,但这与原始问题无关。若您在通道中有1000个成员,那个么它将为1000个客户机进行同步迭代。