4.缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库

解决方案:
1.缓存空对象(简单粗暴)

2.布隆过滤

代码实现:

@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 通过id查询商户信息
* @param id
* @return
*/
@Override
public Result queryById(Long id) {
//1.直接从redis中查询商铺id
String json = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);
//2.判断redis中是否有
if(StringUtils.isNotBlank(json)){
//3.如果有直接返回查询结果
//将json格式转换为对象
Shop shop = JSONUtil.toBean(json, Shop.class);
return Result.ok(shop);
}
if(json!=null){//!=null 就为""
//返回一个错误
return Result.fail("店铺信息不存在");
}
//4.如果没有 从数据库中查
Shop sp = this.getById(id);
if(sp==null){
//5.数据库中没有直接返回错误信息
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,"",CACHE_NULL_TTL, TimeUnit.MINUTES);
return Result.fail("信息错误");
}
//6.将数据信息保存到redis中
//将sp转化为json格式
String shopJson = JSONUtil.toJsonStr(sp);
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,shopJson,CACHE_SHOP_TTL, TimeUnit.MINUTES);
//7.将信息返回给客户端
return Result.ok(sp);
}
总结:
1.缓存穿透产生的原因?
用户请求的数据在缓存和数据库都不存在,不断发起这样的请求,会给数据库带来压力
2.缓存穿透的解决方案?
缓存null



















