在开发中,我们在查数据时,通常是先查redis,redis中有就返回redis中数据,redis中没有就再查数据库由于每次业务查询的方法不同,我们难免会在代码中重复写if-else
那我们能不能将这种重复性代码进行封装起来,提升代码的可扩展性,健壮性呢ok,让我们来想一下,如果要实现上面的方案,我们应该编写一个什么方法来实现理想的实现方法就是 function(Method RedisFunction,Method DataBankFunction){ if(redis中没有值){ 执行数据库查询 }else{ 返回redis查找的数据 } } 有了思路,我们就考虑考虑用哪种技术来实现它。 不卖关子了,我想到的是使用函数式编程的方案!
详细介绍函数式编程可以参考其他文章这里就不介绍了。
首先我们准备一点基础业务代码:
//模拟数据库查询
public interface DataBank {
String getDataInDataBank(boolean x);
}
class DataBankImpl implements DataBank{
@Override
public String getDataInDataBank(boolean x) {
if(!x){
return "数据库查询成功!有数据,返回的是数据库中的数据";
}
System.out.println("数据库查询无结果");
return null;
}
}
//***********************************************************************、
//模拟redis
interface RedisData{
String getDataInRedis(boolean x);
}
class RedisDataImpl implements RedisData{
@Override
public String getDataInRedis(boolean x) {
if(x){
return "redis中有数据,返回redis中数据";
}
System.out.println("redis中查询无结果");
return null;
}
}
使用函数式编程封装:
/**
*
* @param value 参数值
* @param type 返回值Class
* @param redisFunction redis查询方法
* @param dataBankFunction 数据库查询方法
* @param <T> 参数类型
* @param <R> 返回值类型
* @return
*/
public static <T,R> R getData(T value,Class<R> type, Function<T,R> redisFunction,Function<T,R> dataBankFunction){
// 先查redis
R apply = redisFunction.apply(value);
if(apply!=null){
return apply;
}
return dataBankFunction.apply(value);
}
测试:
public static void main(String[] args) {
String data = getData(false, String.class,
value -> new RedisDataImpl().getDataInRedis(value),
value -> new DataBankImpl().getDataInDataBank(value)
);
System.out.println("最终返回的结果:"+data);
}
具体执行结果:
当传入false时
当传入true时:
优雅的实现了先查redis再查数据库,以后根据业务需求,自己传入相应的业务查询方法,和各种参数值即可!
新手小白,还望指教!