请教一下redis的参数client-output-buffer-limit pubsub是怎么优化的?如果参数设置client-output-buffer-limit pubsub 0 0 0对服务器有什么影响?

最近后台服务偶发报错:
redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:198)
at redis.clients.util.RedisInputStream.read(RedisInputStream.java:180)
at redis.clients.jedis.Protocol.processBulkReply(Protocol.java:158)
at redis.clients.jedis.Protocol.process(Protocol.java:132)
at redis.clients.jedis.Protocol.processMultiBulkReply(Protocol.java:183)
at redis.clients.jedis.Protocol.process(Protocol.java:134)
at redis.clients.jedis.Protocol.read(Protocol.java:192)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:282)
at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:227)
at redis.clients.jedis.JedisPubSub.process(JedisPubSub.java:108)
at redis.clients.jedis.JedisPubSub.proceedWithPatterns(JedisPubSub.java:95)
at redis.clients.jedis.Jedis.psubscribe(Jedis.java:2513)
at BenchRedisConsumer$BenchRunner.run(BenchRedisConsumer.java:208)
at java.lang.Thread.run(Thread.java:745)
对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。如果设置reids参数为client-output-buffer-limit pubsub 0 0 0的话,对于服务器会产生什么影响呢?还是要根据其他参数弹性的调整这个参数?

Jedis有个空闲线程移除方法:testWhileIdle,具体实现在org.apache.commons.pool2.impl.GenericObjectPool
Jedis中默认的触发频率是30s,当然这个可以自己配置,对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接这个可能就是因为jedis自身清除了未被调用的线程,另外还有个可能
服务实例比较多redis-server的连接数占满了,实例过多导致线程创建过多,大量闲置的连接被redis-server主动断开,导致实例中会存在很多失效的连接,虽然每隔30s会进行一次清理,但是redis-server断开的频率可能更高因为连接满了不够用,导致Jedis获取到的连接大概率无效,
影响方面没试过,建议根据项目需要自己调整吧

https://blog.csdn.net/LuyaoYing001/article/details/80264347

对于普通客户端来说,限制为0,也就是不限制。因为普通客户端通常采用阻塞式的消息应答模式,何谓阻塞式呢?如:发送请求,等待返回,再发送请求,再等待返回。这种模式下,通常不会导致Redis服务器输出缓冲区的堆积膨胀;
对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是8M,当输出缓冲区超过8M时,会关闭连接。持续性限制是,当客户端缓冲区大小持续60秒超过2M,则关闭客户端连接;
对于slave客户端来说,大小限制是256M,持续性限制是当客户端缓冲区大小持续60秒超过64M,则关闭客户端连接。