我尝试使用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/