Redis丢失订阅消息和client-output-buffer-limit属性配置说明

最近使用Redis缓存行情数据,发现程序运行一段时间后,出现subscribe线程再也不可以接收到订阅的行情数据,发现是由Redis的输出缓冲机制致使的。redis

Redis为了解决输出缓冲区消息大量堆积的隐患,设置了一些保护机制,主要采用两种限制措施:缓存

  • 大小限制,当某一客户端缓冲区超过设定值后直接关闭链接;
  • 持续性限制,当某一客户端缓冲区持续一段时间占用过大空间时关闭链接。

经过CONFIG GET *查看,能够找到客户端输出缓冲区的默认配置:服务器

167) "client-output-buffer-limit"
168) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
  • 1
  • 2
  1. 对于普通客户端来讲,限制为0,也就是不限制。由于普通客户端一般采用阻塞式的消息应答模式,何谓阻塞式呢?如:发送请求,等待返回,再发送请求,再等待返回。这种模式下,一般不会致使Redis服务器输出缓冲区的堆积膨胀;
  2. 对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是8M,当输出缓冲区超过8M时,会关闭链接。持续性限制是,当客户端缓冲区大小持续60秒超过2M,则关闭客户端链接;
  3. 对于slave客户端来讲,大小限制是256M,持续性限制是当客户端缓冲区大小持续60秒超过64M,则关闭客户端链接。

上述三种规则都是能够修改的。能够经过CONFIG SET 命令设置或者直接修改redis.conf线程

config set client-output-buffer-limit pubsub 0 0 0 #将hard limit和soft limit同时置0,关闭该限制。code

相关文章
相关标签/搜索