什么是缓存击穿
解决缓存击穿问题
通过返回一个空值回去,就不会一直访问到数据库了。
public Result queryById(Long id) {
//1.从redis查询商品
String shopJson = stringRedisTemplate.opsForValue().get("cache:shop:"+id);
//2.判断是否存在
if(StrUtil.isNotBlank(shopJson)){
//存在 直接返回
Shop shop = JSONUtil.toBean(shopJson,Shop.class);
return Result.ok(shop);
}
if(shopJson!=null){
return Result.fail("店铺不存在");
}
//4.不存在,根据id查询数据库
Shop shop = getById(id);
//5.不存在,返回错误
if (shop== null){
stringRedisTemplate.opsForValue().set("cache:shop:"+id,JSONUtil.toJsonStr(""),2L, TimeUnit.MINUTES);
return Result.fail("店铺不存在");
}
//6.存在 写入redis
stringRedisTemplate.opsForValue().set("cache:shop:"+id,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
return Result.ok();
}