背景:
1、jedis升级 redisTemplate
2、测试 准生产一切正常,生产环境部署 JedisConnectionException: Unexpected end of stream
排查过程:
1、首先对比升级过程代码,发现 漏掉了testOnBorrow testWhileIdle参数
代码补全后,测试 准生产依旧正常
2、对比 redis环境异常,发现 生产环境 5.0.8 ,测试环境和准生产 3.0.2版本
测试环境 搭建5.0.8 环境 ,搭建完成,无法复现 部署异常。
参考生产配置,重新搭建 5.0.8 ,异常复现。
问题定位:
本地复现时,发现redis注入正常,redis get和set时异常,配置 testOnBorrow testWhileIdle 后又正常,定位是 redis链接不可用 。
原因:
1、testOnBorrow testWhileIdle 两参数配合使用 ,检测本次获取redis链接是否可用,若不可用,则取到可用链接为止
2、测试与生产redis环境差异,除版本因素外,根本原因在于
单位 s
测试环境 timeout 0 tcp-keepalive 0
正式环境 timeout 2 tcp-keepalive 300
这就导致连接池管理redis链接时,
测试环境 每次获取的都是新连接,漏配 检测连接是否可用参数,不影响使用
正式环境,连接空闲2s后已不可用,但是 redis服务端tcp检查 300s检测回收一次连接,连接池存在不可用的连接,漏配 检测连接是否可用参数,导致获取不可用的连接
timeout 设置2 s:防止高并发的时候,同时请求连接过多,将连接打满
tcp-keepalive 300s:防止缓存击穿,
参考: