Redis分布式锁进阶第三十八篇:缓存穿透、击穿、雪崩 生产级完整解决方案
前言
前面篇章全部围绕Redis分布式锁进行深度讲解,本篇开始转入Redis缓存生产核心难题。缓存穿透、缓存击穿、缓存雪崩是面试必问、生产必踩的三大故障。本文保持连载简洁干货风格,直白讲清成因、风险、落地解决方案,全部为线上可直接使用的生产方案。
一、缓存穿透(查询不存在的数据)
1. 概念成因
用户请求的数据缓存没有、数据库也没有,请求直接穿透缓存,全部打到数据库。 常见场景:恶意伪造id、非法参数、空数据查询。
2. 危害
大量空请求压垮数据库,数据库频繁查询空数据,CPU飙升,正常业务SQL被阻塞。
3. 生产解决方案(由简到优)
-
空值缓存:查询为空,依然缓存空数据,过期时间短(30s~5min),避免重复穿透。
-
布隆过滤器:前置拦截,判断数据是否存在,不存在直接拦截,不访问Redis、数据库。
-
参数校验:非法id、负数、空字符串直接在网关层拦截。
-
限流防刷:单ip、单账号限制请求频率。
4. 优缺点说明
空值缓存实现最简单;布隆过滤器适合海量数据、高并发拦截;一般业务空缓存+参数校验足够使用。
二、缓存击穿(热点key过期)
1. 概念成因
某一个热点key突然过期,海量并发请求瞬间打到数据库,单节点压力爆炸。 典型场景:秒杀商品、爆款活动、首页热门数据。
2. 和穿透区别
穿透:查不存在数据;击穿:查存在数据,刚好key过期。
3. 生产解决方案
-
互斥锁(常用):Redis分布式锁,同一时间只允许一个线程查库,其他线程等待。
-
热点key永不过期:取消expire,后台异步更新,避免主动过期。
-
逻辑过期:数据内置过期时间,Redis不删除,后台异步刷新,业务永远有数据。
4. 业务选型
普通热点数据:永不过期;强一致性活动数据:分布式锁;高并发不准停机:逻辑过期。
三、缓存雪崩(大批量key同时失效)
1. 概念成因
大批量缓存key同一时刻集体过期,或者Redis宕机,大量请求瞬间压入数据库,造成数据库雪崩宕机。
2. 产生场景
-
批量导入数据,过期时间设置一致;
-
Redis主从切换、宕机、断电;
-
缓存热点集中,过期时间统一。
3. 生产解决方案
-
过期时间加随机值:基础方案,打散过期时间,避免集中失效。
-
多级缓存:本地Caffeine缓存 + Redis缓存,双层兜底。
-
Redis高可用:哨兵、集群部署,避免单机宕机。
-
服务熔断降级:Redis异常时,直接返回默认数据、友好提示,不查库。
-
定时预热缓存:高峰期前提前刷新热门key。
四、三者极简区别(面试必背)
| 类型 | 核心原因 | 攻击对象 | 最优方案 |
|---|---|---|---|
| 穿透 | 查询不存在数据 | 数据库 | 空缓存+布隆过滤器 |
| 击穿 | 单个热点key过期 | 数据库 | 分布式锁、永不过期 |
| 雪崩 | 大批量key同时失效 | 整套服务 | 随机过期+多级缓存+降级 |
五、生产通用缓存规范
-
所有缓存统一加随机过期时间,预防雪崩;
-
空数据务必缓存,时间不宜过长;
-
热门商品禁止固定过期时间,优先永不过期;
-
对外接口必须加限流、熔断、降级;
-
核心业务必须部署Redis集群,禁止单机上线;
-
禁止大量冷数据同时写入,防止批量过期。