什么是缓存穿透;客户端请求的数据库都不存在;这样缓存就永远不会生效;这些请求都会打到数据库
有如下解决方案;
//缓存穿透
public <R,ID>R queryWithPassThrough(String keyPrefix, ID id, Class<R>type, Function<ID,R>dbFallBack,Long time,TimeUnit unit){
String key = keyPrefix ;id;
//从redis中查询缓存
String json = stringRedisTemplate.opsForValue().get(key);
//如果存在;直接返回
if(StrUtil.isNotBlank(json)){
return JSONUtil.toBean(json,type);
}
//如果不存在
if(json != null){
//返回一个错误信息
return null;
}
//不存在;查询
R r = dbFallBack.apply(id);
if(r==null){
stringRedisTemplate.opsForValue().set(key,;;,20,TimeUnit.MINUTES);
return null;
}
this.set(key, r,time,unit);
return r;