使用Jedis客户端时出现Unexpected end of stream异常
# 问题描述
使用Jedis客户端时,出现redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream异常。
这种异常是客户端缓冲区异常,产生这个问题可能有以下三个原因:
# 原因1
Jedis连接同时被多个线程并发使用
# 解决方案
排查自身代码是否使用JedisPool管理Jedis连接,是否存在并发操作Jedis的情况。正常的情况是一个线程使用一个Jedis连接,可以使用JedisPool管理Jedis连接,实现线程安全,避免出现这种情况。
# 原因2
输出缓冲区满
# 解决方案
根据实际情况合理设置Redis输出缓冲区限制,确定不是因为缓冲区太小,导致链接关闭,进而引起 Unexpected end of stream ,可以临时都设置成 0(表示关闭缓冲区限制)来验证此种场景。
# 原因3
长时间闲置连接被服务端主动断开
# 解决方案
可以查询关于空闲超时时间的设置以及自身连接池配置是否需要做空闲检测。当此时间设置过短时,同一个 jedis 链接,两次访问 redis 服务的时间间隔 > ${timeout} , 服务端会单方关闭这个jedis链接,第二次使用这个jedis对象 操作 redis 时,会发生 Unexpected end of stream ,这种情况可以可以将超时时间的值设置为0。
云数据库Redis默认提供代理模式连接,代理与Redis之间没有设置超时时间,客户端与代理之间的超时时间通过client-timeout参数控制,默认值为120秒。如果通过代理连接,您可以控制台 (opens new window),在参数配置页面设置client-timeout参数运行值为0,操作步骤请参见参数配置。如果使用直连访问,由于timeout的值已默认设置为0,因此您可以忽略此操作。