缓存穿透

什么是缓存穿透

查询一个不存在的数据,缓存层和数据层都不会命中

  • 缓存穿透导致每次查询都要请求到储存层,失去了保护储存层的意义
  • 大量的空值查询,因储存层不具备高并发,可能出现宕机。

形成原因:

  • 自身业务代码问题
  • 恶意攻击、爬虫

如何解决缓存穿透

  1. 缓存空对象
    • 储存层未命中时,该对象返回给缓存层保留,再次访问直接访问缓存就能找到。保护了后端数据。
    • 造成问题:
      1. 缓存里保留了大量了空值,造成缓存过大。解决方法:给保留的空值设置过期时间。
      2. 缓存和后端的数据不一致,需要消息队列或者其他方式清除空对象。
  2. 布隆过滤器
    • 在访问缓存层和存储层之前,将存在的 key 用布隆过滤器提前保存起来(布隆过滤器的特点就是,如果布隆过滤器认为某个 key 不存在,那么这个 key 一定不存在,就不用再请求缓存和数据库了)

缓存雪崩

缓存击穿

缓存热点

BigKey问题

缓存和数据库一致问题