赞
踩
redis执行sunion时,由于key多,且里面的set值比较多,指令时间复杂的为(N),获取数据超时。(迁移到新redis环境时,运行该方法时出现了下面的异常)
- Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
- at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:199) ~[jedis-2.9.0.jar:?]
- at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40) ~[jedis-2.9.0.jar:?]
百度了一下,出错的原因大概有下面三种情况:
1.输出缓冲区满。
2.长时间闲置连接被服务端主动断开,可以查询timeout配置的设置以及自身连接池配置是否需要做空闲检测。
3.不正常并发读写:Jedis对象同时被多个线程并发操作,可能会出现上述异常。
登录redis,查看配置
- CONFIG GET client-output-buffer-limit
-
- 1) "client-output-buffer-limit"
- 2) "normal 67108864 33554432 10 slave 4294967296 2147483648 1200 pubsub 33554432 8388608 60"
- 64M 32M 32M 8M
normal 普通客户端
pub/sub客户端
对于slave客户端来说
硬限制 当output-buffer的大小大于4294967296 b = 4G 之后就会断开连接 (4294967296 / 1024 / 1024 / 1024)
软限制 当output-buffer的大小大于2147483648 b = 2G并且超过了1200秒的时候就会断开连接
机子连的是normal端
检查 redis config 中的 client-output-buffer-limit 配置
client-output-buffer-limit normal 0 0 0
请根据实际情况合理设置Redis输出缓冲区限制,确定不是因为缓冲区太小,导致链接关闭,进而引起 Unexpected end of stream ,可以临时都设置成 “0(关闭缓冲区限制)” 来验证此种场景。
问题到这里就解决了,输出缓存区的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。