Jedis连接池配置参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jedis连接池配置参数相关的知识,希望对你有一定的参考价值。

参考技术A JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

maxActive :控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。

maxIdle :控制一个pool最多有多少个状态为idle(空闲)的jedis实例;

whenExhaustedAction :表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;
WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;

maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;

testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;

testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());

testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;

numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;

minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;

lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;

其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1

20210604 Redis连接池常用配置

Redis Client封装的大致步骤

1)创建配置对象(通过连接池配置对象创建连接池,根据具体的场景配置连接池参数 JedisPoolConfig),

2)创建连接池对象(单例模式管理JedisPool,连接池中会有很多jedis实例,RedisPool对象会很大,所以写成单例模式),

3)获取连接实例Jedis(别忘了归还连接释放资源,否则连接可能会被耗尽),

4)释放连接;在try块里面有了其他异常会导致resouce无法正常关闭,导致某个Jedis实例用完后没有还给JedisPool,导致资源不足。 出现异常导致Jedis连接无法关闭,所以要在finally里面释放资源

 

JedisPool的配置参数很大程度上依赖于实际应用需求、软硬件能力,JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

maxTotal 最大连接数

maxIdle 最小连接数

maxWaitMillis 获取连接时最大等待时间

testOnReturn 释放检测连接

testOnBorrow 获取检测连接

whenExhaustedAction [ɪgˈzɔ:stɪd] 连接耗尽时采取的策略

1)maxTotal 最大连接数,连接池的最大连接数,控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted( 耗尽状态 )。

2)maxWaitMillis 最大等待时间 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;

3)testOnBorrow:在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;

4)testOnReturn:在return给pool时,是否提前进行validate操作;

5)whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。

(1)WHEN_EXHAUSTED_FAIL 表示无jedis实例时,直接抛出NoSuchElementException;

(2)WHEN_EXHAUSTED_BLOCK 则表示阻塞住,或者达到maxWaitMillis时抛出JedisConnectionException;

(3)WHEN_EXHAUSTED_GROW 则表示新建一个jedis实例,也就说设置的maxTotal无用;

复用连接对象,提高效率。性能高。重复创建连接和关闭连接,浪费资源。

常用类:Jedis,JedisPool,JedisPoolConfig。

通过java客户端Jedis来操作redis。

客户端----->连接池----->redis.

限制最大连接数,防止系统资源耗尽。 两个时间的设置。

获取连接时,测试连接是否可用。怎么检查的?

释放连接时,测试连接是否可用。怎么检查的?

等待空闲连接:如果连接池中连接被取走完了,连接池没有空余连接,当前连接池的状态就是疲劳的。其他需要获取连接的线程就处于等待状态,等待空闲连接。

 

1、什么情况下,会出现连接耗尽情况?

连接池中的所有连接都被占用了,解决这个问题可以增加连接池中连接的个数,但是如果程序有问题,没有释放连接,那你增加多少最终还是会报错,因为连接没有释放回收。

java.util.NoSuchElementException: Timeout waiting for idle object 等待空闲的连接对象超时。idle 空闲。连接对象较少,拿不到连接对象。

java.util.NoSuchElementException: Timeout waiting for idle object

2、连接池配置的连接数过少可能会引起性能问题

查看具体线程信息,明显可以看出来是在等待redis线程池。都在等待获取连接,导致tps上不去。因为单个get或者set只有几毫秒,不可能慢的。

复现场景:1个连接,100万次处理。

3、timeBetweenEvictionRunsMillis;[ɪˈvɪkʃn]:驱除、驱赶。连接池中的连接空闲超过一定时间将会被回收。

minEvictableIdleTimeMillis; 连接池中连接可空闲的时间, 单位毫秒(如果连接超过多少毫秒没有被使用,就会被释放掉)

每n毫秒检查一次连接池中空闲的连接,把空闲时间超过m毫秒的连接断开,直到连接池中的连接数到minIdle为止。

4、问题:Could not return the resource to the pool;

不能将redis连接放回池内,放回连接池的对象是无效的对象。进行了两次returnResource释放连接资源造成的,因为第一次return成功以后,第二次return就会报上面这个错误。

1) 释放资源的时候,判断是否为空;2)把连接返回给连接池的时候,要进行校验,参数设置为testOnReturn(true); 3) 在finally中释放连接,防止抛出异常连接释放失败。

finally 
    if (jedis != null) 
        log.info("queryBuildingListFromCache 释放连接资源");
        jedis.close();
    

 

以上是关于Jedis连接池配置参数的主要内容,如果未能解决你的问题,请参考以下文章

Jedis的配置和优化

rsdispool线程池怎么配置带有密码的redis

ssh+连接池配置出现的问题

20210604 Redis连接池常用配置

20210604 Redis连接池常用配置

Redis:实例结合源码分析Jedis连接池原理以及Jedis连接池的实现