在不同的线程中使用相同的Jedis实例会发生并发错误。但是创建太多的Jedis实例也不好,因为这意味着会建立很多Socket连接,也会导致不必要的错误发生。单一Jedis实例不是线程安全的。为了避免这些问题,可以使用JedisPool, JedisPool是一个线程安全的网络连接池。可以用JedisPool创建一些可靠Jedis实例,可以从池中拿到Jedis的实例。 这种方式可以解决那些问题并且会实现高效的性能
1)创建JedisPool
JedisPool pool = new JedisPool();
或者
JedisPool pool = new JedisPool("127.0.0.1",6379);
或者
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(80);
//设置最大空闲数
config.setMaxIdle(20);
//设置超时时间
config.setMaxWaitMillis(3000);
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379);
2)使用JedisPool获得Jedis对象
JedisPool pool = new JedisPool();
Jedis jedis = pool.getResource();
3)从JedisPool获得的Jedis对象再使用后调用close方法即可
通过查看源码可知,close方法内部会把这个jedis对象进回收
public void close(){
if (this.dataSource != null) {
if (this.client.isBroken())
this.dataSource.returnBrokenResource(this);
else
this.dataSource.returnResource(this);
}else{
this.client.close();
}
}