为什么提议JedisPool的maxIdle与maxActive设置成一样的数值

  • 时间:2025-10-12 05:28 作者: 来源: 阅读:1
  • 扫一扫,手机访问
摘要:JedisPool使用Apache Common Pool里面的GenericObjectPool来管理连接对象,可以先看看以下文章来了解GenericObjectPool。 原文链接:https://www.cnblogs.com/chenjian5/p/5149312.html 某天,我在做压测的时候,发现Jedis偶尔会出现这个问题 redis.cli

JedisPool使用Apache Common Pool里面的GenericObjectPool来管理连接对象,可以先看看以下文章来了解GenericObjectPool。
原文链接:https://www.cnblogs.com/chenjian5/p/5149312.html

某天,我在做压测的时候,发现Jedis偶尔会出现这个问题

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
        at redis.clients.util.Pool.getResource(Pool.java:53)
        at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
                ...................
Caused by: java.net.SocketTimeoutException: connect timed out

先贴上配置信息

spring.redis.jedis.pool.max-active=1500
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.max-idle=50
spring.redis.jedis.pool.min-idle=10
spring.redis.timeout=3000

我来分析一下,
第一,这只是偶尔出现的问题,redis不可访问这个缘由先排除在外。
然后看看最大连接数,已经是1500了,按理来说已经是挺大的了,先不改。
接着,去检查代码里是否存在使用jedis后没有关闭连接的情况,没找到。

那是不是配置的参数有问题呢?
我在网上查找JedisPool配置参数的时候,看到一句话:maxIdle该参数一般尽量与maxActive一样,以提高并发数。
真的是这样吗,我们来看一下源码。我在org.apache.commons.pool2.impl.GenericObjectPool#returnObject看到这个代码:

int maxIdleSave = this.getMaxIdle();
if (this.isClosed() || maxIdleSave > -1 && maxIdleSave <= this.idleObjects.size()) {
    try {
        this.destroy(p);
    } catch (Exception var11) {
        this.swallowException(var11);
    }
}

代码里显示,当空闲对象数量大于maxIdle,归还的对象就直接被销毁了。
会不会有一种情况,在高并发之后,大量对象销毁,连接关闭。然后在销毁功能还没结束的时候,又来了一波高并发,导致新建的连接和正在销毁的连接超过了最大连接数,从而获取不到新的连接。

我来做个实验,修改一个配置信息,提高maxIdle看看

spring.redis.jedis.pool.max-idle=500

接着对程序进行多次压测,很惊喜没有出现上面说的异常了。
在压测结束后,我们赶紧来看一下JedisPool的信息





为什么提议JedisPool的maxIdle与maxActive设置成一样的数值


从图中可以看出,活跃对象加上空闲对象等于500个。由于我们设置了max-idle=500,所以在没有请求的时候,空闲对象只有500个。当有请求过来时,就从这500个空闲对象当中去取Jedis对象。

我们再来看看JedisPoolConfig默认的配置

public class JedisPoolConfig extends GenericObjectPoolConfig {
    public JedisPoolConfig() {
        this.setTestWhileIdle(true);
        this.setMinEvictableIdleTimeMillis(60000L);
        this.setTimeBetweenEvictionRunsMillis(30000L);
        this.setNumTestsPerEvictionRun(-1);
    }
}

由于minEvictableIdleTimeMillis默认是60秒,一分钟之后我们再来看看JedisPool信息





为什么提议JedisPool的maxIdle与maxActive设置成一样的数值


从图中可以看出,活跃对象加上空闲对象等于10个。由于我们设置了min-idle=10。

最后,再将maxIdle修改成1500,再做几次实验。图就不贴上来了。

这个实验中,我提高了maxIdle,从而被销毁的连接减少,没有出现上面所说的异常,但是还是有可能会出现异常的。我觉得maxIdle参数与maxActive一样,就能更好避免出现这个异常。而且,好像没必要把maxIdle与maxActive设置成不一样吧。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Fortigate飞塔防火墙如何开启DNS转发/DNS代理(2025-10-14 23:58)
【系统环境|】有了它,再也不用担心电脑弹窗广告和病毒啦!(2025-10-14 23:57)
【系统环境|】如何关闭恼人的电脑弹窗广告?2招搞定(2025-10-14 23:55)
【系统环境|】实用软件推荐:电脑广告弹窗多?用他,都给你屏蔽掉!(2025-10-14 23:55)
【系统环境|】Nginx篇01——基本安装配置和静态页面设置(2025-10-14 23:54)
【系统环境|】Linux端口开放,查看,删除,防火墙(2025-10-14 23:53)
【系统环境|】安全HTTP头部配置: 基于CSP与HSTS的Web安全策略(2025-10-14 23:52)
【系统环境|】老K:做私域过1000万的赛道全部都聚焦在女性身上!(2025-10-14 23:51)
【系统环境|】JavaScript跨域问题: 如何解决跨域访问和资源共享的安全策略(2025-10-14 23:51)
【系统环境|】家庭七级财务防火墙(2025-10-14 23:50)
手机二维码手机访问领取大礼包
返回顶部