6.3 连接池技术JedisPool
6.3.1 JedisPool
1:从资源池借Jedis对象
2:Jedis执行命令
3:返回执行结果
4:归还Jedis对象给连接池
6.3.2 示例代码
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolTestor {
@Test
public void testJedisPool(){
GenericObjectPoolConfig config = new JedisPoolConfig();
// 建议MaxTotal与MaxIdle一致,
// 设置连接池中最多允许放100个Jedis对象
config.setMaxTotal(100);
// 设置连接池中最大允许的空闲连接
config.setMaxIdle(50);
// 设置连接池中最小允许的连接数,需要根据实际情况进行部署和设置
config.setMinIdle(10);
// 借出连接的时候是否测试有效性,推荐false
config.setTestOnBorrow(false);
// 归还时是否测试,推荐false
config.setTestOnReturn(false);
// 创建时是否测试有效
config.setTestOnCreate(true);
// 当连接池内jedis无可用资源时,是否等待资源,true
config.setBlockWhenExhausted(true);
// 没有获取资源时最长等待1秒,1秒后还没偶的话就报错
config.setMaxWaitMillis(1000);
//创建jedis,运行后就自动根据上面的配置来初始化jedis资源
JedisPool pool = new JedisPool(config , "192.168.132.128" , 6666);
Jedis jedis = null;
try {
//从连接池中"借出(borrow)"一个jedis对象
jedis = pool.getResource();
jedis.auth("123456");
jedis.set("abc" , "bbb");
System.out.println(jedis.get("abc"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if(jedis != null){
//在使用连接池的时候,close()方法不再是关闭,而是归还(return)
jedis.close();
}
}
}
}
6.3.3 直连和连接池的对比
对比项 | 优点 | 缺点 |
---|---|---|
直连 | 简单粗暴 适用于少量连接的场景 | Jedis线程不安全 存在连接泄露的可能 |
连接池 | Jedis对象预先生成,降低开销 便于连接资源进行监管与控制 | 实用麻烦 参数较多,规划不合理 容易出现问题 |
最终还是推荐使用连接池。