缓存击穿穿透雪崩处理方案
面试必问的”缓存三兄弟”——击穿、穿透、雪崩。本文将三者放在同一场景下,给出从识别到解决的完整方案。
一、三种问题的定义与区别
- 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 异常告警
七、总结
- 三种问题的本质——“缓存和数据库之间的一致性被打破”
- 方案选择决策树
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!