封装Redis工具类(泛型返回加函数式声明参数)

小编最近在看实战redis,黑马的,看到有一章是P46封装Redis工具类

废话不多说!直接上代码

调用的代码:

//具体的上下文代码去b站找黑马redis入门到实战 P46集

//优雅的写出这样,参数意义看方法!
Shop shop = queryWithPassThrough(CACHE_SHOP_KEY,id,shop.class,id2->getById(id2))

方法:

//具体的上下文代码去b站找黑马redis入门到实战 P46集


//我这里只是写泛型和函数式

/**
  <R>代表是返回的泛型
  <ID>代表参数ID id 因为不确定id之后是什么类型,用泛型指定
   ID id代表是具体的那个类型,又这个入参决定<ID>
   Class<R> type 代表是具体的那个类对象,又这个入参决定<R>
   Funtion<ID,R> dbFallback 函数式(ID是入参,R是返回)
   String keyPrefix 是redis的key,一般是前缀+id绑定
   Funtion<ID,R> dbFallback ID表示参数,R表示返回值
*/
pulic <R,ID> R queryWithPassThrough(String keyPrefix,
                                    ID id,
                                    Class<R> type, 
                                    Funtion<ID,R> dbFallback){

    String key  = keyPrefix + id;
    //1.从redis查询商品缓存
    String json = stringRedisTemplate.opsForValue().get(key);
    //2.判断是否存在
    if(StrUtil.isNotBlank(json)){
      //3.存在,直接返回
      return JSONUtil.toBean(json,type);
    }
     //判断命中的是否是空值
    if(json != null){
      
        return null;
    }
    
    //4.不存在,更加ID查询数据库,函数式声明
       R r = dbFallback.apply(id);
   //5.不存在,返回错误
    if(r == null){
     //将空值写入redis中 
     stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL,TimeUnit.MINUTES);
     return null;
        
   }

  //存在,写入redis中 
  stringRedisTemplate
  .opsForValue().set(key,JSONUtil.toJsonStr(r),CACHE_NULL_TTL,TimeUnit.MINUTES);
  return r


}

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值