优雅使用函数式编程实现先查redis,再查数据库

在开发中,我们在查数据时,通常是先查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再查数据库,以后根据业务需求,自己传入相应的业务查询方法,和各种参数值即可!

新手小白,还望指教!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值