什么是缓存穿透、击穿、雪崩
缓存穿透 (Cache Penetration)
定义: 指查询一个根本不存在的数据。
由于缓存不命中,请求会穿透到数据库,而数据库也查不到。因为数据库没查到,所以也不会回写缓存。这就导致每次针对该 Key 的请求都会直达数据库。
- 场景: 恶意攻击(查询 ID 为 -1 的数据)或业务逻辑逻辑漏洞。
- 解决方案:
- 布隆过滤器 (Bloom Filter): 在请求进入缓存层之前,先判断 Key 是否可能存在。
- 缓存空对象: 即便数据库查不到,也在缓存里存一个
null(过期时间设短点)。
缓存击穿 (Cache Breakdown)
定义: 指一个极热点的 Key 在过期的瞬间,有海量并发请求同时涌入。
因为缓存刚刚失效,所有请求都会同时打到数据库去尝试加载数据并回设缓存。
- 场景: 秒杀活动中的明星商品、突发热搜。
- 解决方案:
- 设置永不过期: 逻辑上不设 TTL,由后台异步更新。
- 互斥锁 (Mutex Lock): 只允许一个请求去数据库查询并更新缓存,其他请求等待。
缓存雪崩 (Cache Avalanche)
定义: 指在某一个时间段,大面积的 Key 同时过期,或者 Redis 宕机。
这导致原本应该由缓存承接的巨大流量全部像雪崩一样压向数据库,导致后端系统崩溃。
- 区别: 击穿是“单点爆破”,雪崩是“全面瘫痪”。
- 解决方案:
- 随机过期时间: 给每个 Key 的 TTL 加上一个随机扰动值,防止集体过期。
- 高可用架构: 搭建 Redis 哨兵(Sentinel)或集群(Cluster)。
- 限流降级: 数据库压力过大时,直接拒绝部分请求。
总结对比表
| 现象 | 原因 | 目标数据 | 核心对策 |
|---|---|---|---|
| 穿透 | 数据不存在 | 不存在的数据 | 布隆过滤器 / 缓存空值 |
| 击穿 | 热点 Key 过期 | 极热点数据 | 互斥锁 / 逻辑永不过期 |
| 雪崩 | 大量 Key 过期或 Redis 宕机 | 大批量数据 | 随机过期时间 / 熔断限流 |
本文来自博客园,作者:我已有个她,转载请注明原文链接:https://www.cnblogs.com/wantnotshould/p/19862907
浙公网安备 33010602011771号