java - 如何在多线程环境下使用JedisPool创建多个Jedis实例

标签 java multithreading connection-pooling jedis

我尝试使用JedisPool创建多个Jedis实例以供多线程使用(每个线程可以有一个Jedis实例)。但是当我尝试使用 JedisPool.getResource() 创建多个实例时,它总是给我相同的 Jedis 实例。以下代码还会给出 redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream due to single 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;
}

任何帮助将不胜感激。谢谢!

最佳答案

您应该在多线程环境中使用JedisPool。但是,通过您的实现,您实际上是在这种情况下使用 Jedis

要解决这个问题,您可以在 MyThread 构造函数中采用 JedisPool 而不是 Jedis

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);
        }
    }
}

关于java - 如何在多线程环境下使用JedisPool创建多个Jedis实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50266666/

相关文章:

java - 使用命令提示符创建包含外部 jar 的 war 文件

c# - .net 连接池

oracle - Hikaricp Oracle 连接问题

java - 带有 Spring JMS 的 ActiveMQ - 如何发送 NONPERSISTENT 消息?

java - Mockito 使用参数模拟新实例调用

java - 了解 future /线程

java - 高级多线程 - Java

python - 如何实现动态数量的并发线程?

c++ - 多个线程竞相将相同的数据设置为相同的值

Tornado 中具有多个进程的异步连接池