在 Redis 缓存使用中,穿透、击穿、雪崩是三种常见的缓存异常场景,均会导致大量请求直接穿透到数据库,可能引发数据库压力骤增甚至宕机。以下是具体解释:

1. 缓存穿透(Cache Penetration)
定义:指查询一个根本不存在的数据(如 ID 为 -1 的记录),由于缓存中没有该数据(缓存未命中),请求会直接穿透到数据库,而数据库中也没有该数据,导致每次查询都会触发一次无效的数据库访问。

危害:若存在大量此类请求(如恶意攻击),会导致数据库压力过大,甚至宕机。

解决方案:

缓存空值:对查询结果为空的数据,也在 Redis 中缓存一个空值(设置较短的过期时间),避免后续请求直接穿透到数据库。
布隆过滤器:在缓存前加一层布隆过滤器,预先存储所有可能存在的有效 key。查询时先通过布隆过滤器判断 key 是否存在,若不存在则直接返回,避免穿透到数据库。

2. 缓存击穿(Cache Breakdown)
定义:指一个热点 key(被高频访问的 key)在缓存中过期的瞬间,恰好有大量请求同时访问该 key,导致缓存未命中,所有请求瞬间穿透到数据库,造成数据库短时间内压力骤增。

危害:数据库瞬间被大量请求冲击,可能导致过载或宕机。

解决方案:

互斥锁(分布式锁):当缓存失效时,只有一个请求能获取锁并去数据库查询,其他请求等待重试,避免大量请求同时访问数据库。
热点 key 永不过期:对于热点 key,不设置过期时间,由后台异步更新缓存,确保缓存始终有效(需注意内存占用)。
提前更新缓存:在热点 key 过期前,通过定时任务主动更新缓存,避免过期瞬间的请求穿透。

3. 缓存雪崩(Cache Avalanche)
定义:指在某一时间段内,大量缓存 key 同时过期,或 Redis 服务宕机,导致大量请求无法命中缓存,全部穿透到数据库,造成数据库压力激增,甚至宕机。

危害:数据库可能因无法承受突发流量而崩溃,进而引发整个系统故障。

解决方案

过期时间错开:给不同 key 设置随机的过期时间(如基础过期时间 + 随机值),避免大量 key 同时过期。
缓存集群高可用:部署 Redis 集群(如主从 + 哨兵、Redis Cluster),避免单点故障导致整个缓存服务不可用。
降级与限流:当数据库压力过大时,对部分非核心请求进行降级处理(返回默认值),或通过限流控制请求量,保护数据库。
持久化机制:开启 Redis 的 RDB 或 AOF 持久化,在 Redis 宕机后能快速恢复数据,减少缓存失效时间。

总结
穿透:查询不存在的数据,缓存和数据库都无值。
击穿:热点 key 过期瞬间,大量请求穿透到数据库。
雪崩:大量 key 同时过期或缓存服务故障,导致所有请求穿透到数据库。

三者的核心差异在于触发场景和范围,解决方案需根据具体场景针对性设计,核心目标是减少数据库的无效压力。

最后修改:2025 年 09 月 09 日
个人博客