簡單的使用連接池
// redis連接池的配置首先要創(chuàng)建一個連接池配置對象
JedisPoolConfig config = new JedisPoolConfig();
// 創(chuàng)建Jedis連接池對象
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
// 獲取連接
Jedis jedis = jedisPool.getResource();
// 使用
jedis.set("demo", "demo111");
// 關(guān)閉,歸還連接到連接池
jedis.close();
模板方法的使用方式
如果在每個需要使用jedis的地方都需要獲取jedisPool宠互,然后獲取連接常侦,操作完成之后,還需要將連接使用歹啼,大量的重復的工作,如何避免大量的重復代碼呢?
@FunctionalInterface
public interface JedisCallback<T> {
public T invoke(Jedis jedis);
}
public class JedisOperation {
private JedisPool jedisPool;
public void init() {
// 比較特殊的是,redis連接池的配置首先要創(chuàng)建一個連接池配置對象
JedisPoolConfig config = new JedisPoolConfig();
// 當然這里還有設置屬性的代碼
// 創(chuàng)建Jedis連接池對象
jedisPool = new JedisPool(config, "localhost", 6379);
}
public <T> T execute(JedisCallback<T> callback) {
Jedis jedis = jedisPool.getResource();
try {
return callback.invoke(jedis);
}
catch (Exception ex) {
throw new RuntimeException("");
}
finally {
jedis.close();
}
}
}
在需要使用jedis的地方使用以下方式螟加。
JedisOperation jedisOperation = new JedisOperation();
jedisOperation.init();
String demo = jedisOperation.execute(jedis -> jedis.get("demo"));
System.out.printf(demo);
JedisOperation 可以與spring整合,通過注入的方式使用熊泵。
動態(tài)代理的使用方式
雖然使用以上方式可以復用一些代碼,但是還是需要在 jedisOperation.execute 等一大串代碼甸昏,有沒有更簡單的方式呢顽分?
可以通過動態(tài)代理的方式代理Jedis對象,在Jedis相關(guān)的操作前后獲取鏈接和釋放鏈接施蜜。
Jdk動態(tài)代理要通過接口的方式實現(xiàn)卒蘸,需要找到Jedis的接口,通過代理該接口翻默,達到操作Jedis的功能缸沃。Jedis實現(xiàn)的接口多,為了實現(xiàn)這么多接口的功能修械,可以定義一個接口趾牧,繼承Jedis的接口,在通過代理改接口肯污,達到調(diào)用Jedis的功能翘单。
public interface IJedis extends JedisCommands, MultiKeyCommands {
}
public class JedisProxy<T> implements InvocationHandler {
private JedisPool jedisPool;
public void init() {
// 比較特殊的是吨枉,redis連接池的配置首先要創(chuàng)建一個連接池配置對象
JedisPoolConfig config = new JedisPoolConfig();
// 當然這里還有設置屬性的代碼
// 創(chuàng)建Jedis連接池對象
jedisPool = new JedisPool(config, "localhost", 6379);
}
private Class<T> jedisInterface;
public Class<T> getJedisInterface() {
return jedisInterface;
}
public JedisProxy(Class<T> jedisInterface) {
this.jedisInterface = jedisInterface;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Jedis jedis = jedisPool.getResource();
try {
return method.invoke(jedis, args);
}
catch (InvocationTargetException e) {
throw new RuntimeException("出現(xiàn)異常");
}
catch (Exception e) {
throw new RuntimeException("出現(xiàn)異常");
}
finally {
jedis.close();
}
}
}
public class JedisProxyFactory<T> {
private IJedis iJedis;
public T newInstance(JedisProxy<T> jedisProxy) {
return (T) Proxy.newProxyInstance(jedisProxy.getJedisInterface().getClassLoader(), new Class[] {jedisProxy.getJedisInterface()}, jedisProxy);
}
}
在要使用的地方直接調(diào)用IJedis接口就好了,IJedis繼承了Jedis的實現(xiàn)接口哄芜∶餐ぃ可像使用Jedis方式一樣使用IJedis。
JedisProxy<IJedis> jedisProxy = new JedisProxy<>(IJedis.class);
jedisProxy.init();
JedisProxyFactory jedisProxyFactory = new JedisProxyFactory();
IJedis jedis = (IJedis) jedisProxyFactory.newInstance(jedisProxy);
String demo = jedis.get("demo");
System.out.println(demo);
IJedis 可與spring整合认臊,通過注入的方式使用