Jedis连接踩坑日记
Jedis连接踩坑日记
背景: 线上某块业务的增删改功能全部都不可用。页面发送了xhr请求之后 状态一直处于pending状态,后端没有日志产生
排查路线与解决办法
第一:由于服务在内网里面,无法进行远程调试。所以采用比较笨的方式,在代码里面多加一些日志,最后定位
JedisUtil.getJedis().hset(RedisConstant.WHITE, model.getRdiUuid(), JSON.toJSONString(model.getRdiWhitelist().split(",")));
JedisUtil是前任封装的工具类,代码执行到这里的时候请求会处于阻塞状态
我之前一直用的是RedisTemplate来操作redis的 并没有出现过类似的情况,这也是第一次接触jedis,看完这块代码的时候没有及时发现问题,索性在chatGPT上问答了一下
gpt的答案提到了关于资源释放的关键字,然后我看了下jedis实例确实有close方法。
@Override
public void close() {
if (dataSource != null) {
JedisPoolAbstract pool = this.dataSource;
this.dataSource = null;
if (client.isBroken()) {
pool.returnBrokenResource(this);
} else {
pool.returnResource(this);
}
} else {
super.close();
}
}
跟踪一下代码发现close是重写了父类BinaryJedis的close方法,而BinaryJedis是实现了Closeable接口
在Java里面实现了Closeable接口的类是可以通过try with resource语法来处理资源关闭问题的,所以我们将原来的写法改成
try (Jedis jedis = JedisUtil.getJedis()) {
jedis.hset(RedisConstant.WHITE, model.getRdiUuid(), JSON.toJSONString(model.getRdiWhitelist().split(",")));
}
验证
将jedis连接池改成5 重启项目 调用了有jedis相关的接口之后 很快后续的请求便发生了阻塞,使用try with resource语法之后 问题不再复现了。
完结 撒花!!!