目录
概念
用户请求查询的数据在缓存和数据库中都没有,那么最终请求都会进入到数据库,缓存会失效
两种解决方法:缓存NULL对象,使用布隆过滤器
业务逻辑改造
代码实现
解决缓存穿透问题
public Shop queryWithPassThtough(Long id){
//先从redis中查询缓存
String object = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);
//如果有直接返回
if(strUtil.isNotBlank(object)){ //StringUtil.isNotBlank
//转成Java对象
Shop bean = JSONUtil.toBean(object, Shop.class);
return bean;
}
//判断命中的是否是空值
if (object != null){
return null;
}
//如果没有,查询数据库
Shop shop = this.getById(id);
//如果数据库中没有,报错
if (shop == null){
//return Result.fail("没有该店铺");
//将" "写入redis
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id, " ",CACHE_NULL_TTL, TimeUnit.MINUTES);
return null;
}
//如果有,写入redis
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,JSONUtil.toJsonStr(shop),30, TimeUnit.MINUTES);
return shop;
}