一、背景
关于Redis双向同步预研,应用在接入Dynomite之后出现Redis连接异常情况,抛出
Unexpected end of stream
。
二、结论
-
Dynomite关于Redis指令支持
中表示不支持
TIME
指令 -
spring-data-redis 1.6.0.RELEASE 中当执行
PEXPIRE
有效期超过Integer.MAX_VALUE
,避免溢出,会采用TIME
指令获取Redis Server时间,并基于此进行叠加 - 升级 spring-data-redis 版本可解决该问题(验证 1.8.16.RELEASE 可解决)
三、过程
3.1 现象
应用在接入Dynomite之后,调用某接口出现Redis连接异常。异常日志如下
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:199)
at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
at redis.clients.jedis.Protocol.process(Protocol.java:151)
at redis.clients.jedis.Protocol.read(Protocol.java:215)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
at redis.clients.jedis.BinaryJedis.expire(BinaryJedis.java:436)
at org.springframework.data.redis.connection.jedis.JedisConnection.expire(JedisConnection.java:807)
复制代码
3.2 定位
确认Redis客户端配置
进入应用终端,使用Arthas获取
JedisConnectionFactory
信息
java -jar arthas-boot.jar
# 获取RequestMappingHandlerAdapter索引
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandleMethod
#