testOnBorrow testWhileIdle 配置不当导致redis异常

背景:

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:防止缓存击穿,


参考:

Redis集群配置参数及优化

redis.conf配置说明

redis性能优化——生产中实际遇到的问题排查总结

JedisPool的testOnBorrow、testOnReturn和testWhileIdle参数的实现原理

你可能感兴趣的:(testOnBorrow testWhileIdle 配置不当导致redis异常)