缓存穿透、缓存击穿、缓存雪崩
-
缓存穿透 (Cache Penetration):查询不存在的数据,缓存和数据库都不命中。
- 成因:恶意查询不存在的key,绕过缓存直接请求数据库。
- 影响:大量请求直达数据库,造成数据库压力过大。
- 解决:
- 缓存空值或默认值:即使数据不存在也缓存,下次请求直接返回缓存的空值。
- 布隆过滤器:在缓存之前设置布隆过滤器,快速判断key是否存在,避免无效请求穿透到缓存和数据库。
-
缓存击穿 (Cache Breakdown / Cache Stampede):热点 key 在缓存失效的瞬间,大量请求同时访问数据库。
-
成因:热点 key 过期,并发请求同时查询该 key,缓存未命中,请求全部落到数据库。
- 影响:数据库瞬间压力剧增,可能导致服务崩溃。
- 解决:
- 互斥锁:只允许一个线程重建缓存,其他线程等待缓存重建后访问缓存。
- 设置永不过期或逻辑过期:避免热点 key 同时失效,可以后台异步更新缓存。
-
缓存雪崩 (Cache Avalanche):大量缓存 key 在同一时间失效,导致大量请求同时访问数据库。
-
成因:缓存服务宕机或大量 key 同时过期。
- 影响:数据库瞬间压力达到峰值,甚至宕机,导致整个系统崩溃。
- 解决:
- 缓存高可用:使用集群部署缓存,避免单点故障。
- 设置不同的过期时间:避免大量 key 同时过期,可以设置随机过期时间。
- 服务降级与熔断:当缓存失效时,对部分服务进行降级处理,或直接熔断请求,保护数据库。
- 二级缓存:设置多级缓存,例如本地缓存和分布式缓存,降低缓存雪崩的影