Java 如何在多线程环境中使用JedisPool创建多个Jedis实例
我尝试使用JedisSpool创建多个用于多线程的Jedis实例,每个线程可以有一个Jedis实例。但当我试图使用JedisPool.getResource创建多个实例时,它总是给我相同的Jedis实例。下面的代码还将为我提供redis.clients.jedis.exceptions.JedisConnectionException:由于多个线程只有一个jedis实例,所以流意外结束Java 如何在多线程环境中使用JedisPool创建多个Jedis实例,java,multithreading,connection-pooling,jedis,Java,Multithreading,Connection Pooling,Jedis,我尝试使用JedisSpool创建多个用于多线程的Jedis实例,每个线程可以有一个Jedis实例。但当我试图使用JedisPool.getResource创建多个实例时,它总是给我相同的Jedis实例。下面的代码还将为我提供redis.clients.jedis.exceptions.JedisConnectionException:由于多个线程只有一个jedis实例,所以流意外结束 private final static JedisPoolConfig poolConfig = build
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。但是,通过你的实施,你实际上是在这种情况下使用绝地武士
为了解决这一问题,你可以选择绝地而不是绝地作为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类中使用绝地的吗?@sazzad inside MyThread,它将使用Jedis.exists来查看指定的密钥是否存在。我正在尝试问题中提到的相同方法,并获得不同的绝地实例。这种方法有什么不正确之处。每个线程都有自己的绝地实例,这不是线程安全吗
class MyThread {
void doSomething() {
try (Jedis jedis = jedisPool.getResource()) {
jedis.exists(key);
}
}
}