Как создать несколько экземпляров Jedis с помощью JedisPool в многопоточной среде - PullRequest
0 голосов
/ 10 мая 2018

Я пытался использовать JedisPool для создания нескольких экземпляров Jedis для многопоточности (каждый поток может иметь один экземпляр Jedis). Но когда я пытался создать несколько экземпляров с помощью JedisPool.getResource (), он всегда дает мне один и тот же экземпляр Jedis. И следующий код также даст мне redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream из-за одного экземпляра Jedis для нескольких потоков.

private final static JedisPoolConfig poolConfig = buildPoolConfig();
private static JedisPool jedisPool = new JedisPool(poolConfig, "localhost");

public static void main(String[] args) throws Exception {
    MyThread[] myThreads = new MyThread[4];
    for (int i = 0; i < myThreads.length; i++) {
       try (Jedis jedis = jedisPool.getResource()) {
           System.out.println("jedis " + i  + ": "+ jedis);
           myThreads[i] = new MyThread(jedis);
           myThreads[i].start();
       }
    }
    jedisPool.close();
}

private static JedisPoolConfig buildPoolConfig() {
    final JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxTotal(128);
    poolConfig.setMaxIdle(128);
    poolConfig.setMinIdle(16);
    poolConfig.setTestOnBorrow(true);
    poolConfig.setTestOnReturn(true);
    poolConfig.setTestWhileIdle(true);
    poolConfig.setMinEvictableIdleTimeMillis(Duration.ofSeconds(60).toMillis());
    poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofSeconds(30).toMillis());
    poolConfig.setNumTestsPerEvictionRun(3);
    poolConfig.setBlockWhenExhausted(true);
    return poolConfig;
}

Любая помощь будет очень признательна. Спасибо!

1 Ответ

0 голосов
/ 10 мая 2018

Вы должны использовать JedisPool в многопоточной среде. Но, по вашей реализации, вы на самом деле используете Jedis в этой ситуации.

Чтобы решить, что вы можете взять JedisPool вместо Jedis для MyThread конструктора.

public static void main(String[] args) throws Exception {
    MyThread[] myThreads = new MyThread[4];
    for (int i = 0; i < myThreads.length; i++) {
        myThreads[i] = new MyThread(jedisPool);
        myThreads[i].start();
    }
    jedisPool.close();
}

Во время каждой операции в классе MyThread, возьмите объект Jedis из пула и используйте его. Например:

class MyThread {
    void doSomething() {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.exists(key);
        }
    }
}
...