5.3 使用 jedis 的对象池

2016-03-20 19:47:58 6,084 0

jedis 通过 commons-pool 来提供其对象池的功能,其对象池类有 JedisPool 和 ShardedJedisPool,面向普通的 redis 连接池和 pre-sharding 的 redis 连接池。

在连接池的使用和配置层面,这两个类基本没什么差别。

配置 jedis 的连接池,一般通过 JedisPoolConfig 类完成,其提供了一个不同于基类的默认值,当然也可以通过 org.apache.commons.pool.impl.GenericObjectPool.Config 类来配置,这个类的默认值我们可以在 commons-pool 对象池配置的小节中看到。

对象池的使用

jedis 创建对象池的方式:

JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

使用池中的对象,是通过 JedisPool 的 getResource 和 returnResource 来得到和归还资源:

Jedis jedis = pool.getResource();
try {
/// ... do stuff here ... for example
jedis.set("foo", "bar");
String foobar = jedis.get("foo");
jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike");
Set<String> sose = jedis.zrange("sose", 0, -1);
} catch (JedisConnectionException e) {
// returnBrokenResource when the state of the object is unrecoverable
if (null != jedis) {
pool.returnBrokenResource(jedis);
jedis = null;
}
} finally {
/// ... it's important to return the Jedis instance to the pool once you've finished using it
if (null != jedis)
pool.returnResource(jedis);
}
/// ... when closing your application:
pool.destroy();

commons-pool 对象池配置

jedis 的对象池是通过apache的commons-pool实现的。 其对象池的配置是通过org.apache.commons.pool.impl.GenericObjectPool.Config 类完成。

Config 是一个简单的值对象类,其成员都有预设的默认值。

我们将 Config 类的各个成员的配置含义描述如下:

maxActive

控制池中对象的最大数量。默认值是 8,如果是负值表示没限制。

maxIdle

控制池中空闲的对象的最大数量。默认值是 8,如果是负值表示没限制。

minIdle

控制池中空闲的对象的最小数量。默认值是 0。

whenExhaustedAction

指定池中对象被消耗完以后的行为,有下面这些选择:

>> WHEN_EXHAUSTED_FAIL 0

>> WHEN_EXHAUSTED_GROW 2

>> WHEN_EXHAUSTED_BLOCK 1

如果是 WHEN_EXHAUSTED_FAIL,当池中对象达到上限以后,继续 borrowObject 会抛出NoSuchElementException 异常。

如果是 WHEN_EXHAUSTED_GROW,当池中对象达到上限以后,会创建一个新对象,并返回它。

如果是 WHEN_EXHAUSTED_BLOCK,当池中对象达到上限以后, 会一直等待,直到有一个对象可用。 这个行为还与 maxWait 有关,如果 maxWait 是正数,那么会等待 maxWait 的毫秒的时间,超时会抛出 NoSuchElementException 异常;如果 maxWait 为负值,会永久等待。

whenExhaustedAction 的默认值是 WHEN_EXHAUSTED_BLOCK, maxWait 的默认值是-1。

maxWait

whenExhaustedAction 如果是 WHEN_EXHAUSTED_BLOCK,指定等待的毫秒数。如果 maxWait是正数,那么会等待 maxWait 的毫秒的时间,超时会抛出 NoSuchElementException 异常;如果 maxWait 为负值,会永久等待。maxWait 的默认值是-1。

testOnBorrow

如果 testOnBorrow 被设置, pool 会在 borrowObject 返回对象之前使用 PoolableObjectFactory的 validateObject 来验证这个对象是否有效,要是对象没通过验证,这个对象会被丢弃,然后重新选择一个新的对象。testOnBorrow 的默认值是 false。

testOnReturn

如果 testOnReturn 被设置, pool 会在 returnObject 的时候通过 PoolableObjectFactory 的validateObject 方法验证对象,如果对象没通过验证,对象会被丢弃,不会被放到池中。testOnReturn 的默认值是 false。

testWhileIdle

指定 idle 对象是否应该使用 PoolableObjectFactory 的 validateObject 校验,如果校验失败,这个对象会从对象池中被清除。这个设置仅在 timeBetweenEvictionRunsMillis 被设置成正值( >0) 的时候才会生效。testWhileIdle 的默认值是 false。

timeBetweenEvictionRunsMillis

指定驱逐线程的休眠时间。如果这个值不是正数( >0),不会有驱逐线程运行。timeBetweenEvictionRunsMillis 的默认值是-1。

numTestsPerEvictionRun

设置驱逐线程每次检测对象的数量。这个设置仅在 timeBetweenEvictionRunsMillis 被设置成正值( >0)的时候才会生效。numTestsPerEvictionRun 的默认值是 3。

minEvictableIdleTimeMillis

指定最小的空闲驱逐的时间间隔(空闲超过指定的时间的对象,会被清除掉)。这个设置仅在 timeBetweenEvictionRunsMillis 被设置成正值( >0)的时候才会生效。minEvictableIdleTimeMillis 默认值是 30 分钟。

softMinEvictableIdleTimeMillis

与 minEvictableIdleTimeMillis 类似,也是指定最小的空闲驱逐的时间间隔(空闲超过指定的时间的对象,会被清除掉),不过会参考 minIdle 的值,只有 idle 对象的数量超过 minIdle 的值,对象才会被清除。

这个设置仅在 timeBetweenEvictionRunsMillis 被设置成正值( >0)的时候才会生效,并且这个配置能被 minEvictableIdleTimeMillis 配置取代( minEvictableIdleTimeMillis 配置项的优先级更高)。softMinEvictableIdleTimeMillis 的默认值是-1。

lifo

pool 可以被配置成 LIFO 队列( last-in-first-out)或 FIFO 队列( first-in-first-out),来指定空闲对象被使用的次序。lifo 的默认值是 true。

JedisPoolConfig 的调整

jedis 的对象池是通过 commons-pool 实现的,对对象池的配置应该通过 JedisPoolConfig 来完成, jedis 提供了自己的配置参数:

public class JedisPoolConfig extends Config {
public JedisPoolConfig() {
// defaults to make your life with connection pool easier :)
setTestWhileIdle(true);
setMinEvictableIdleTimeMillis(60000);
setTimeBetweenEvictionRunsMillis(30000);
setNumTestsPerEvictionRun(-1);
}

简单的说,是启用了 commons-pool 的驱逐线程,并配置了驱逐线程的轮询参数。


上一篇:5.2 ShardedJedis 下一篇:6.0 reids高可用