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语法之后 问题不再复现了。

完结 撒花!!!

posted @ 2024-04-15 14:30  实习小生  阅读(22)  评论(0编辑  收藏  举报