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