Redis 通道中 PUB/SUB 时消息的大小限制是多少

What's the size limitation of a message when PUB/SUB in Redis channel

我目前正在我的一个项目中实现 redis PUB/SUB,这引起了我的关注,Redis 通道中 PUB/SUB 时消息的大小限制是多少。限制是否等于计算机的可用内存?或者在配置文件的某处会有一个阈值。谢谢!

更新答案

在我下面的原始答案之后,我找到了实际答案。 redis.conf中有一个配置参数叫:

client-output-buffer-limit

您可以通过以下方式查看:

config get client-output-buffer limit
"normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

pub/sub 后的 33554432 是 pub/sub 客户端的最大缓冲区大小,8388608 是软限制,不能超过 60 秒。

因此,如果您使用如下命令提高限制,我下面的答案会发生变化:

config set client-output-buffer-limit "normal 0 0 0 slave 268435456 67108864 60 pubsub 53554432 8388608 60"

关于这是否可取、安全甚至明智,我没有做过任何测试,但认为它与答案有实质性的相关性。

原答案

我不知道限制在哪里,仅供参考,我用 redis-cli 客户端做了一些简单的测试,订阅如下:

redis-cli SUBSCRIBE myStream

然后我发送数据,像这样以 1MB 的倍数发送数据:

dd if=/dev/zero bs=$((1024*1024)) count=20  | redis-cli -x PUBLISH myStream

所以,上面的命令在 20MB 时有效,但以下 21MB 的命令失败了:

dd if=/dev/zero bs=$((1024*1024)) count=21  | redis-cli -x PUBLISH myStream

并且订阅者与消息断开连接:

Error: Server closed the connection

我称之为“经验”答案。

仅供参考,我自己进行了实验,我的机器 (Debian 5.4.8-1) 上的上限大约为 21MB 到 22MB(可能因 OS 和 redis 版本而异) , 会导致redis ConnectionError: Connection closed by server.