【Redis】Redis间歇性超时之minIdle参数的影响

本文深入分析了在高并发场景下,Spring中JedisPoolConfig配置不当导致的Redis连接池超时问题。通过调整minIdle参数,确保了连接池中有足够的空闲连接,有效降低了请求延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近在做一个服务的过程中,需要从redis中读取热点数据,限制的超时时间不超过10ms,在1000并发压测的情况下,平均每个请求的耗时为4~5ms,但是和上游联调调用的时候总会很多请求超时,让人胆战心惊,百思不得其解,那么看一下Spring中JedisPoolConfig的配置:

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 最大空闲数 -->
    <property name="maxIdle" value="600" />
    <!-- 最大空连接数 -->
    <property name="maxTotal" value="600" />
    <!-- 最大等待时间 -->
    <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
    <!-- 连接超时时是否阻塞,false时报异常,ture阻塞直到超时, 默认true -->
    <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}" />
    <!-- 返回连接时,检测连接是否成功 -->
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>

配置了maxIdle最大空闲连接数,但是没有配置minIdle(最小空闲连接数),与其说是最小空闲连接数,不如说是"至少需要保持的空闲连接数",那么在初始化连接池的过程中就会建立minIdle个连接,在使用连接的过程中,如果连接数超过了minIdle,那么继续建立连接,但是不超时maxIdle。minIdle的默认值如下代码所示:

public class GenericObjectPoolConfig extends BaseObjectPoolConfig {
    public static final int DEFAULT_MAX_TOTAL = 8;
    public static final int DEFAULT_MAX_IDLE = 8;
    public static final int DEFAULT_MIN_IDLE = 0;
    private int maxTotal = 8;
    private int maxIdle = 8;
    private int minIdle = 0;

    ....
}

可见minIdel的默认值为0,因此,在一段时间的间隔后,连接就被回收了,导致再次请求的时候需要重新建立连接,传输数据,这就是耗时问题所在,解决方案,加上minIdle配置即可:

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 最大空闲数 -->
    <property name="maxIdle" value="600" />
    <!-- 最大空连接数 -->
    <property name="maxTotal" value="600" />
    <!-- 最小空连接数 -->
    <property name="minIdle" value="450" />
    <!-- 最大等待时间 -->
    <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
    <!-- 连接超时时是否阻塞,false时报异常,ture阻塞直到超时, 默认true -->
    <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}" />
    <!-- 返回连接时,检测连接是否成功 -->
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    <!--定时对线程池中空闲的链接进行validateObject校验 -->
    <property name="testWhileIdle" value="true" />
    <!--在进行returnObject对返回的connection进行validateObject校验 -->
    <property name="testOnReturn" value="true" />
</bean>

 

Author:忆之独秀

Email:leaguenew@qq.com

注明出处:https://blog.csdn.net/lavorange/article/details/84448910

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值