一次jedis使用不规范,导致redis客户端close_wait大量增加的bug

本文详细描述了一次由于未正确使用Jedis导致Redis客户端close_wait连接异常增加的问题。从配置检查、代码分析到系统状态观察,最终定位到Jedis连接未被正确关闭,引发common-pool2的资源池问题。修复了代码中未调用close方法归还Jedis实例后,问题得到解决。文章强调理解技术原理和避免随意修改已验证代码的重要性。
摘要由CSDN通过智能技术生成

最近开发反馈了一个问题,说系统使用了codis之后,发现当并发量上来之后,会抛出异常:could not get resource from pool,更底层的原因是:Timeout waiting for idle object,然后开始查问题。

1、可能是配置问题?

我们对jodis进行了一层浅封装,将配置进行独立,开放给开发人员的配置比较少,也就几个:

codis.pool.maxTotal=1000 //对象池最大数
codis.pool.maxIdle=1000 //idle对列最大数
codis.pool.minIdle=0 //idle队列最小数
codis.pool.maxWaitMillis=20000 //获取连接超时时间

没发现什么问题,因为其他系统也是就配置这几个参数,然后调整这些参数,没有任何改善,仍然会出现问题

2、代码分析

RoundRobinJedisPool代码中有如下代码:

    public Jedis getResource() {
        ImmutableList<PooledObject> pools = this.pools;
        if (pools.isEmpty()) {
            throw new JedisException("Proxy list empty");
        }
       
        for (;;) {
          int current = nextIdx.get();//1.获取上次使用哪个proxy
          int next = current >= pools.size() - 1 ? 0 : current + 1;//2.轮询到另外一个proxy
          if (nextIdx.compareAndSet(current, next)) {// 3.设置本次使用的proxy,以供下次使用
              return pools.get(next).pool.getResource();//获取该proxy的JedisPool并获取Jedis实例
          }
        }
    }

(提出问题的同事发现的,感谢)for循环内部的代码不是原子的,尝试添加了同步块,突然发现,问题解决了,此问题不报了,到此,以为解决了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值