jedis直連
每次操作都會創建一個jedis對象,執行完畢后關閉連接后釋放,對應的就是一次Tcp連接。
jedis連接池
預先生成一批jedis連接對象放入連接池中,當需要對redis進行操作時從連接池中借用jedis對象,操作完成后歸還。這樣jedis對象可以重復使用,避免了頻繁創建socket連接,節省了連接開銷。
方案對比
連接池簡單使用
public class Demo {
public static void main(String[] args) {
//連接池配置對象,包含了很多默認配置
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
//初始化Jedis連接池,通常來講JedisPool是單例的
JedisPool jedisPool = new JedisPool(poolConfig, "119.23.226.29", 6379);
Jedis jedis = null;
try {
//1.從連接池獲取jedis對象
jedis = jedisPool.getResource();
//2.執行操作
jedis.set("hello", "jedis");
System.out.println(jedis.get("hello"));
} catch (Exception e) {
e.printStackTrace();
} finally{
//如果使用JedisPool,那么close操作不是關閉連接,代表歸還連接池
if(jedis != null){
jedis.close();
}
}
}
}
連接池封裝使用
public class RedisPool {
//jedis連接池,使用static保證連接池在tomcat啟動時就加載出來
private static JedisPool pool;
//連接池中的最大連接數
private static Integer maxTotal = Integer.parseInt(PropertiesUtil.getProperty("redis.max.total", "20"));
//連接池中的最大空閑連接數
private static Integer maxIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.max.idle", "20"));
//連接池中的最小空閑連接數
private static Integer minIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.min.idle", "0"));
//借用連接時是否進行驗證
private static Boolean testOnBorrow = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.borrow", "true"));
//返還連接時是否進行驗證
private static Boolean testOnReturn = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.return", "true"));
private static String redisIp = PropertiesUtil.getProperty("redis.ip");
private static Integer redisPort = Integer.parseInt(PropertiesUtil.getProperty("redis.port"));
private static String password = PropertiesUtil.getProperty("redis.password");
//初始化連接池,只會調用一次
private static void initPool() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(maxTotal);
config.setMaxIdle(maxIdle);
config.setMinIdle(minIdle);
config.setTestOnBorrow(testOnBorrow);
config.setTestOnReturn(testOnReturn);
//連接池耗盡的時候,是否阻塞,false會拋出異常,true會阻塞直到超時拋出異常,默認為true
config.setBlockWhenExhausted(true);
//超時時間2s
pool = new JedisPool(config, redisIp, redisPort, 1000*2, password);
}
static {
initPool();
}
//從連接池中借用一個實例
public static Jedis getJedis() {
return pool.getResource();
}
}
public class RedisPoolUtil {
public static String set(String key, String value) {
Jedis jedis = null;
String result = null;
try {
jedis = RedisPool.getJedis();
result = jedis.set(key, value);
} catch (Exception e) {
log.error("set key:{} value:{} error", key, value, e);
} finally {
shutdown(jedis);
}
return result;
}
public static void shutdown(Jedis jedis) {
if (null != jedis) {
// close會判斷連接是否破損而執行對應的回收操作
jedis.close();
}
}
}