Jedis系列:Jedis多线程访问
2018-12-05 本文已影响14人
seawish
正文
jedisPool.getResource()方法无法在普通多线程中使用,可能触发whenExhaustedAction:
whenExhaustedAction: 当“连接池”中active数量达到阀值时,即connection资源耗尽时,连接池需要采取的手段, 默认为1:
-> 0 : 抛出异常,
-> 1 : 阻塞,直到有可用链接资源
-> 2 : 强制创建新的链接资源
// 普通多线程模式
// 该方法无法运行
Thread thread = new Thread(null, null, "thread" + j) {
public void run() {
System.out.println(this.getName());
Jedis jedis = jedisPool.getResource(); // 在whenExhaustedAction=1时,线程运行到这一步可能block
System.out.println(jedis);
}
使用ExecutorService可以解决jedisconnection资源耗尽问题。该方式需要将ExecutorService与jedisPool结合,以进行多线程下的jedis访问。
// 正确使用方法
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisPoolTest {
private static final ExecutorService pool = Executors.newCachedThreadPool();
private static final CountDownLatch latch = new CountDownLatch(20);
private static final JedisPool jPool = new JedisPool();
public static void main(String[] args) {
long start = System.currentTimeMillis();
for(int i=0;i<20;i++){
pool.execute(new RedisTest());
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis() - start);
pool.shutdownNow();
}
static class RedisTest implements Runnable{
@Override
public void run() {
Jedis jedis = jPool.getResource();
int i = 10000;
try{
while(i-->0){
jedis.set("hello", "world");
}
}finally{
jedis.close();
latch.countDown();
}
}
}
}
参考文献
本文作者: seawish
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!