Jedis Pool如何运作?

ipk*_*iss 32 java connection-pooling jedis

我正在使用Jedis池来管理与Redis服务器的连接.我的示例代码如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

用于创建和检索Jedis池的代码:

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;
    }
 }            
Run Code Online (Sandbox Code Playgroud)

问题是在达到有限连接数后,无法再访问网页.难道我做错了什么?

Ale*_*les 39

您尚未配置池的maxTotal大小,默认值仅为8.您可以将JedisFactory构造函数更改为:


    public JedisFactory() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(128);
        jedisPool = new JedisPool(poolConfig, RedisDBConfig.HOST, RedisDBConfig.PORT, RedisDBConfig.TIMEOUT, RedisDBConfig.PASSWORD);
    }
Run Code Online (Sandbox Code Playgroud)

还要注意WhenExhaustedAction(WHEN_EXHAUSTED_BLOCK)的默认值,因为它可能不是您想要的行为.

Jedis使用Apache Commons Pool,您可以在这里阅读它的参数:GenericObjectPool

  • @JohnMerlino你是对的,在Jedis的最新版本中,他们将公共池改为版本2.X,所以新方法现在被称为setMaxTotal(),很快就会更新答案. (4认同)
  • 您是否有任何提及 JedisPoolConfig 参数的文档?我试图搜索,但只得到了一个没有描述的函数 api 列表。例如,我想知道“WhenExhaustedAction”是做什么的? (2认同)