缓存穿透

业务场景

  1. /**
  2. * 缓存穿透场景
  3. * 要是数据库没有查询到数据,自然没有放到缓存中,用户大量的请求来访问该接口,就会查询多次数据库,造成数据库压力过大
  4. * 解决:
  5. * 数据库中没有查询到数据,也将他放到缓存中,只不过缓存中数据也是空的,避免了缓存击穿
  6. *
  7. * 查询的key在redis中不存在
  8. * 对应的id在数据库中也不存在
  9. * 此时被非法用户进行攻击,大量的请求会直接打到db上
  10. * 造成宕机,从而影响到整个系统
  11. * 这种现象称之为缓存穿透
  12. *
  13. * 解决方案:
  14. * 把空的数据缓存起来,比如空字符串、空对象、空数组和list
  15. */
  16. if(subCatList != null && subCatList.size() > 0) {
  17. redisOperator.set(IndexConstant.catId + rootCatId, JsonUtils.objectToJson(subCatList));
  18. }
  19. else {
  20. redisOperator.set(IndexConstant.catId + rootCatId, JsonUtils.objectToJson(subCatList), 5*60);
  21. }

布隆过滤器

有值的 key 放到1,没有值的key放到0,通过判断0和1就知道当前key是否有值,没有值则不继续进入,则直接返回
image.png

缓存雪崩与预防

什么是缓存雪崩

key 在同一时间失效,大量请求打到数据上
image.png

雪崩预防

永不过期

过期时间错开

多缓存结合

image.png

采购第三方Redis【阿里云Redis服务】

根据公司需求、业务需求选购redis服务
image.png