查看 Redis 连接数
172.31.2.111:7002> CONFIG GET maxclients 1) "maxclients" 2) "10000" 172.31.2.1111:7002>
172.31.1.135:7002> CONFIG GET maxclients pom.xml 依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> <scope>compile</scope> </dependency>
xml配置
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--最小的空闲链接数 10--> <property name="minIdle" value="10"/> <!--最大的空闲链接数 100--> <property name="maxIdle" value="100"/> <!--最大的连接数 500--> <property name="maxTotal" value="500"/> <!--获取资源时进行测试 是--> <property name="testOnBorrow" value="true"/> <!--归还资源时进行测试 否--> <property name="testOnReturn" value="false"/> <!--当资源耗尽时阻塞--> <property name="blockWhenExhausted" value="true"/> <!--最大等待时间 1秒--> <property name="maxWaitMillis" value="1000"/> <!--每10秒测试资源可用性--> <property name="timeBetweenEvictionRunsMillis" value="10000"/> <!--当资源空闲时进行测试 是--> <property name="testWhileIdle" value="true"/> </bean>
参数说明
资源设置和使用
序号 | 参数名 | 含义 | 默认值 | 使用建议 |
1 | maxTotal | 资源池中最大连接数 | 8 | 设置建议见下节 |
2 | maxIdle | 资源池允许最大空闲的连接数 | 8 | 设置建议见下节 |
3 | minIdle | 资源池确保最少空闲的连接数 | 0 | 设置建议见下节 |
4 | blockWhenExhausted | 当资源池用尽后,调用者是否要等待。只有当为true时,下面的maxWaitMillis才会生效 | true | 建议使用默认值 |
5 | maxWaitMillis | 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒) | -1:表示永不超时 | 不建议使用默认值 |
6 | testOnBorrow | 向资源池借用连接时是否做连接有效性检测(ping),无效连接会被移除 | false | 业务量很大时候建议设置为false(多一次ping的开销)。 |
7 | testOnReturn | 向资源池归还连接时是否做连接有效性检测(ping),无效连接会被移除 | false | 业务量很大时候建议设置为false(多一次ping的开销)。 |
8 | jmxEnabled | 是否开启jmx监控,可用于监控 | true | 建议开启,但应用本身也要开启 |
空闲资源监测
序号 | 参数名 | 含义 | 默认值 | 使用建议 |
1 | testWhileIdle | 是否开启空闲资源监测 | false | true |
2 | timeBetweenEvictionRunsMillis | 空闲资源的检测周期(单位为毫秒) | -1:不检测 | 建议设置,周期自行选择,也可以默认也可以使用下面JedisPoolConfig中的配置 |
3 | minEvictableIdleTimeMillis | 资源池中资源最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除 | 1000 60 30 = 30分钟 | 可根据自身业务决定,大部分默认值即可,也可以考虑使用下面JeidsPoolConfig中的配置 |
4 | numTestsPerEvictionRun | 做空闲资源检测时,每次的采样数 | 3 | 可根据自身应用连接数进行微调,如果设置为-1,就是对所有连接做空闲监测 |
如何配置
maxTotal 最大连接数
考虑的几个因素
- 业务并发量多大
- 客户端命令的执行时间
- Redis 资源开销
这个值不是越大越好,连接过多,容易占用客户端和服务端资源。长时命令的阻塞,通过调节最大连接数,也无济于事。
maxIdle 实际上才是业务需要的最大连接数,maxTotal 是为了给出余量。maxIdel 不要设置过小,否则会建立新的连接, maxIdel 是为了控制空闲资源监测。
常见问题
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool … Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
现象是无法从资源池获取到资源,原因是超时。
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool … Caused by: java.util.NoSuchElementException: Pool exhausted at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)
现象同样是无法获得资源,但是hi因为 blockWhenExhausted为 false ,资源用尽之后,调用者不等待。