直接回答

缓存穿透指查询一个缓存和数据库中都不存在的数据,请求绕过缓存每次都打到数据库,恶意刷不存在的 id 可打垮 DB。主流解决方案:缓存空值(查不到也缓存 null 并设较短 TTL)和布隆过滤器(在缓存前加一道"一定不存在"判断)。

展开解析

  • 缓存空值:实现最简单,DB 查不到就把空结果写进缓存,TTL 设短一点(如 30~60 秒)。缺点:会占额外内存;空值缓存与 DB 后续真实写入之间存在短暂不一致窗口,写入时需同步删除对应 key。
  • 布隆过滤器:把所有合法 key 提前加入过滤器,请求先过过滤器——判定"不存在"直接返回,判定"存在"(可能误判)才走缓存/DB。优点是内存极省,适合 key 集合庞大且相对稳定的场景;缺点是有一定误判率、不支持删除(可用计数布隆或定期重建),且数据新增后要同步加入过滤器。
  • 辅助手段:接口层做参数合法性校验(id ≤ 0 直接拒绝)、对单一 IP/用户限流,挡住低级攻击。

对比记忆:穿透是查不存在的数据(点攻击)、击穿是热点 key 过期(单点)、雪崩是大面积 key 同时失效(面攻击),三者解法不同。