Jedis连接踩坑,如何避免常见问题?

摘要:Jedis连接踩坑日记 背景: 线上某块业务的增删改功能全部都不可用。页面发送了xhr请求之后 状态一直处于pending状态,后端没有日志产生 排查路线与解决办法 第一:由于服务在内网里面,无法进行远程调试。所以采用比较笨的方式,在代码里
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语法之后 问题不再复现了。 完结 撒花!!!