MST

星途 面试题库

面试题:缓存设计之缓存穿透中等难度题

请阐述缓存穿透产生的原因,并列举至少两种常见的防御措施,同时说明每种措施在实际应用中的优缺点。
22.1万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存穿透产生原因

  1. 查询不存在数据:应用程序请求查询一个在数据库和缓存中都不存在的数据。由于缓存中没有命中,就会直接查询数据库,而数据库也无此数据,每次这类请求都会穿过缓存直接打到数据库,当大量此类请求并发时,就会给数据库造成巨大压力,甚至导致数据库崩溃。

常见防御措施及优缺点

  1. 布隆过滤器

    • 优点
      • 高效性:布隆过滤器可以在内存中快速判断一个元素是否存在,时间复杂度接近常数级,对于大规模数据的快速过滤效果显著,能有效拦截大量不存在的数据请求,减少数据库压力。
      • 节省空间:相比于直接存储所有可能的键值,布隆过滤器通过位运算来表示数据,占用的内存空间非常小,适合海量数据场景。
    • 缺点
      • 误判率:布隆过滤器存在一定的误判率,即可能会把不存在的数据误判为存在,但不会把存在的数据误判为不存在。这意味着仍可能有少量无效请求穿透到数据库。
      • 维护成本:如果数据动态变化频繁,如频繁新增或删除数据,布隆过滤器的维护成本较高,因为需要重新构建过滤器以保证准确性。
  2. 缓存空值

    • 优点
      • 实现简单:只需在数据库查询到不存在数据时,将空值(如null)也缓存起来,并设置一个较短的过期时间,实现起来代码改动较小,容易部署。
      • 即时生效:对于首次查询不存在的数据,能立即将其缓存,后续相同请求直接从缓存获取空值,避免重复查询数据库。
    • 缺点
      • 缓存浪费:缓存空值会占用一定的缓存空间,如果此类不存在数据的请求较多,会浪费较多缓存资源。
      • 数据一致性:由于设置了过期时间,在过期后可能又会有请求穿透到数据库,并且如果数据库中数据发生变化(如原本不存在的数据后来插入了),但缓存空值未及时更新,可能导致短暂的数据不一致问题。