面试必问的”缓存三兄弟”——击穿、穿透、雪崩。本文将三者放在同一场景下,给出从识别到解决的完整方案。

一、三种问题的定义与区别

  • 1.1 缓存穿透——查询不存在的数据,缓存和数据库都没有
  • 1.2 缓存击穿——热点 key 过期,大量请求打到数据库
  • 1.3 缓存雪崩——大量 key 同时过期或 Redis 宕机
  • 1.4 一张图区分三种场景

二、缓存穿透的解决方案

  • 2.1 布隆过滤器——原理与实现
  • 2.2 布隆过滤器在 Redis 中的应用——RedisBloom 模块
  • 2.3 Guava BloomFilter 的本地实现
  • 2.4 缓存空值——简单但有局限性
  • 2.5 参数校验——在网关层拦截非法请求

三、缓存击穿的解决方案

  • 3.1 互斥锁——SETNX 实现
  • 3.2 逻辑过期——不设 TTL,value 中存过期时间
  • 3.3 “永不过期”——异步刷新
  • 3.4 三种方案的对比——性能 vs 一致性

四、缓存雪崩的解决方案

  • 4.1 TTL 加随机值——避免集中过期
  • 4.2 多级缓存——本地缓存(Caffeine)+ Redis
  • 4.3 限流降级——Sentinel 保护数据库
  • 4.4 Redis 高可用——哨兵/集群

五、综合方案设计

  • 5.1 一个融合方案——布隆防穿透 + 互斥锁防击穿 + 随机 TTL 防雪崩
  • 5.2 完整代码实现

六、监控与告警

  • 6.1 缓存命中率监控
  • 6.2 数据库 QPS 异常告警

七、总结

  • 三种问题的本质——“缓存和数据库之间的一致性被打破”
  • 方案选择决策树