MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第五章:缓存穿透、缓存击穿、缓存雪崩 📅 2026/7/15 14:40:22 一、缓存穿透Cache Penetration什么是缓存穿透查询一个数据库中本来就不存在的数据。流程用户请求 │ ▼ Redis没有 │ ▼ MySQL没有每次请求都会访问 MySQL。例如查询 user:999999数据库中根本不存在。为什么危险如果有人恶意不断请求不存在的数据100 万次请求 ↓ 100 万次 MySQL 查询数据库压力会很大。企业解决方案① 缓存空值推荐数据库没有数据时Redis user:999999 NULL TTL60 秒下次直接返回不再查询 MySQL。② 布隆过滤器Bloom Filter在查询 Redis 之前先判断数据是否可能存在。如果一定不存在直接返回不访问 Redis 和 MySQL。适用于海量数据场景。二、缓存击穿Cache Breakdown什么是缓存击穿热点数据刚好过期大量请求同时访问数据库。流程热门商品 ↓ Redis 过期 ↓ 10000 人同时访问 ↓ MySQL数据库瞬间压力暴增。企业解决方案① 互斥锁推荐第一个请求查询 MySQL。其他请求等待。查询完成后写入 Redis再继续访问。② 热点数据永不过期由后台主动更新缓存而不是依赖 TTL。适用于热点数据。三、缓存雪崩Cache Avalanche什么是缓存雪崩大量缓存同时过期导致请求全部落到 MySQL。例如100 万个 Key TTL 都是 3600 秒 ↓ 同一时间过期 ↓ 全部访问 MySQL企业解决方案① 随机过期时间推荐不要统一设置3600 秒改为3600~3900 秒让缓存分批过期。② Redis 高可用部署主从、哨兵或集群避免 Redis 故障导致缓存全部失效。四、三者区别问题原因影响解决方案缓存穿透查询不存在的数据MySQL 被频繁查询缓存空值、布隆过滤器缓存击穿热点 Key 过期大量请求访问 MySQL互斥锁、热点数据不过期缓存雪崩大量 Key 同时过期MySQL 瞬间压力暴增随机 TTL、Redis 高可用五、企业最佳实践缓存穿透缓存空值 布隆过滤器缓存击穿互斥锁 热点数据永不过期缓存雪崩随机 TTL Redis 高可用六、本章总结知识点核心内容缓存穿透查询不存在的数据缓存击穿热点 Key 过期缓存雪崩大量 Key 同时过期缓存空值防止穿透布隆过滤器快速判断数据是否可能存在互斥锁防止击穿随机 TTL防止雪崩本章一句话总结穿透查不到数据击穿热点数据过期雪崩大量数据同时过期企业通常通过缓存空值、互斥锁和随机 TTL 来解决。思考题精简回答什么是缓存穿透为什么它会导致 MySQL 压力增大缓存穿透是指查询不存在的数据Redis 和 MySQL 都没有结果。大量请求会绕过 Redis直接访问 MySQL导致数据库压力增大。缓存空值为什么可以解决缓存穿透它有什么缺点查询不到数据时把空结果也缓存到 Redis。下次相同请求直接返回空不访问 MySQL缺点占用Redis空间如果数据后来新增不访问mysql什么是缓存击穿为什么热点数据更容易发生击穿存击穿是指热点 Key 过期瞬间大量请求同时访问数据库。热点数据访问量大一旦失效会同时产生大量数据库请求。为什么使用互斥锁可以解决缓存击穿互斥锁可以保证只有一个请求查询 MySQL 并更新缓存。其他请求等待缓存生成避免大量请求同时访问数据库。什么是缓存雪崩为什么给缓存设置随机过期时间可以缓解雪崩存雪崩是指大量缓存 Key 同时过期导致请求全部访问 MySQL。设置随机 TTL 可以让 Key 分散过期避免数据库瞬间承受大量请求缓存穿透、缓存击穿、缓存雪崩三者最大的区别是什么请分别用一句话概括。缓存穿透查询不存在的数据绕过缓存访问数据库缓存击穿热点数据过期大量请求访问数据库缓存雪崩大量缓存同时失效倒是数据库压力暴涨