4. 缓存穿透、击穿、雪崩的区别?
一.定义与原因
1. 缓存穿透(Cache Penetration)
定义:大量请求查询不存在的数据,导致请求直接穿透缓存,直达数据库。
原因:
恶意攻击:如使用随机不存在的ID发起请求
业务缺陷:未正确处理无效查询(如缓存结果为空)
示例:请求用户ID为-1的数据(数据库中不存在)
解决方案:
布隆过滤器:预存所有合法键,拦截无效请求
缓存空值:对不存在的数据缓存null,设置较短过期时间(如5分钟)
接口限流:对高频无效请求的客户端进行限流或黑名单处理
2. 缓存击穿(Cache Breakdown)
定义:热点数据在缓存过期瞬间,大量并发请求直接冲击数据库
原因:
热点数据缓存过期,且并发请求量极大
未使用互斥锁或异步更新机制
示例:双十一秒杀商品信息缓存过期,瞬间数万请求涌入数据库
解决方案:
互斥锁(Mutex Lock):仅允许一个线程重建缓存,其他线程等待
逻辑过期:缓存永不过期,后台异步更新数据
热点数据预加载:提前续期缓存,避免同时失效
3. 缓存雪崩(Cache Avalanche)
定义:大量缓存数据同时过期或缓存服务宕机,导致所有请求涌向数据库
原因:
缓存数据设置相同的过期时间(如凌晨批量更新后统一失效)
缓存集群故障(如Redis主从全挂)
示例:促销活动结束后,所有商品缓存设置为1小时后过期,导致瞬时数据库压力激增
解决方案:
随机过期时间:在基础过期时间上增加随机值(如基础时间+0~300秒)
多级缓存:本地缓存(Caffeine)结合分布式缓存(Redis),分级失效
服务熔断降级:数据库压力过大时,触发熔断机制返回默认值
高可用架构:Redis集群(主从+哨兵)或云托管服务(如AWS ElastiCache)
二. 对比总结
| 缓存穿透 | 查询不存在的数据 | 单个或少量无效请求 | 拦截无效请求(布隆过滤器、缓存空值) |
| 缓存击穿 | 热点数据过期+高并发 | 单个热点数据 | 避免并发重建(互斥锁+逻辑过期) |
| 缓存雪崩 | 大量数据同时失效或服务宕机 | 全局或大范围缓存失效 | 分散失效时间、多级容错(多级缓存、熔断) |
三. 实战建议
防御组合:布隆过滤器+空值缓存+互斥锁+随机过期时间
监控警告:实时监控缓存命中率、数据库QPS、异常时触发警告
压力测试:模拟高并发场景,验证缓存策略的有效性
总结:
缓存穿透是查询不存在的数据绕过缓存击穿数据库;
缓存击穿是热点数据过期导致瞬间高并发请求压垮数据库;
缓存雪崩是大量缓存同时失效引发数据库连锁崩溃。
区别在与穿透因数据不存在,击穿因单点热点失效,雪崩因大规模缓存失效;
