簡單的使用連接池
// redis連接池的配置首先要創建一個連接池配置對象
JedisPoolConfig config = new JedisPoolConfig();
// 創建Jedis連接池對象
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
// 獲取連接
Jedis jedis = jedisPool.getResource();
// 使用
jedis.set("demo", "demo111");
// 關閉,歸還連接到連接池
jedis.close();
模板方法的使用方式
如果在每個需要使用jedis的地方都需要獲取jedisPool,然后獲取連接,操作完成之后,還需要將連接使用,大量的重復的工作,如何避免大量的重復代碼呢?
@FunctionalInterface
public interface JedisCallback<T> {
public T invoke(Jedis jedis);
}
public class JedisOperation {
private JedisPool jedisPool;
public void init() {
// 比較特殊的是,redis連接池的配置首先要創建一個連接池配置對象
JedisPoolConfig config = new JedisPoolConfig();
// 當然這里還有設置屬性的代碼
// 創建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整合,通過注入的方式使用。
動態代理的使用方式
雖然使用以上方式可以復用一些代碼,但是還是需要在 jedisOperation.execute 等一大串代碼,有沒有更簡單的方式呢?
可以通過動態代理的方式代理Jedis對象,在Jedis相關的操作前后獲取鏈接和釋放鏈接。
Jdk動態代理要通過接口的方式實現,需要找到Jedis的接口,通過代理該接口,達到操作Jedis的功能。Jedis實現的接口多,為了實現這么多接口的功能,可以定義一個接口,繼承Jedis的接口,在通過代理改接口,達到調用Jedis的功能。
public interface IJedis extends JedisCommands, MultiKeyCommands {
}
public class JedisProxy<T> implements InvocationHandler {
private JedisPool jedisPool;
public void init() {
// 比較特殊的是,redis連接池的配置首先要創建一個連接池配置對象
JedisPoolConfig config = new JedisPoolConfig();
// 當然這里還有設置屬性的代碼
// 創建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("出現異常");
}
catch (Exception e) {
throw new RuntimeException("出現異常");
}
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);
}
}
在要使用的地方直接調用IJedis接口就好了,IJedis繼承了Jedis的實現接口。可像使用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整合,通過注入的方式使用