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连接池配置参数的主要内容,如果未能解决你的问题,请参考以下文章