java - data - ¿Cómo funciona Jedis Pool?
redis spring boot (1)
Estoy usando el grupo de jedis para administrar las conexiones al servidor redis. Un código de ejemplo mío como sigue:
<!-- language: lang-java -->
public Set<String> getTopArticleList(int start, int end) {
Set<String> list = null;
Jedis j = JedisFactory.getInstance().getJedisPool().getResource();
Pipeline pipe = j.pipelined();
try {
// do stuff with redis
pipe.sync();
} catch (JedisConnectionException jex) {
JedisFactory.getInstance().getJedisPool().returnBrokenResource(j);
} finally {
JedisFactory.getInstance().getJedisPool().returnResource(j);
}
return list;
}
Y código para recuperar la piscina de jedis.
<!-- language: lang-java -->
class JedisFactory {
private static JedisPool jedisPool;
public JedisFactory() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
jedisPool = new JedisPool(
poolConfig,
RedisDBConfig.HOST,
RedisDBConfig.PORT,
RedisDBConfig.TIMEOUT,
RedisDBConfig.PASSWORD
);
}
public JedisPool getJedisPool() {
return jedisPool;
}
public static JedisFactory getInstance() {
if (instance == null) {
instance = new JedisFactory();
}
return instance;
}
}
El problema es que después de alcanzar el número de conexiones limitadas, ya no se puede acceder a la web. ¿Estoy haciendo algo mal?
No ha configurado el tamaño máximo de la agrupación y el valor predeterminado es solo 8. Puede cambiar el constructor JedisFactory a:
public JedisFactory() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(128);
jedisPool = new JedisPool(poolConfig, RedisDBConfig.HOST, RedisDBConfig.PORT, RedisDBConfig.TIMEOUT, RedisDBConfig.PASSWORD);
}
Tenga cuidado también con el valor predeterminado de WhenExhaustedAction (WHEN_EXHAUSTED_BLOCK), ya que puede que no sea su comportamiento deseado.
Jedis usa Apache Commons Pool, y puedes leer sobre sus parámetros aquí: GenericObjectPool