小编最近在看实战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
}