作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL
Redis(本章节)
Etcd
上个小节我们介绍Redis的数据过期(TTL),如果Redis作为业务数据的前端缓存,如果大量的key同时过期会出现什么情况呢?
Redis 缓存的雪崩、穿透、击穿是缓存架构中最常见的三类故障问题,三者的核心差异在于故障原因、影响范围和应对策略,下面结合原理、场景和解决方案进行详细拆解。
1. 给过期时间添加随机值,分散过期时间示例:EXPIRE key (3600 + rand(0, 600)),让缓存在 60~70 分钟内随机过期2. 核心业务缓存永不过期,由后台异步任务更新缓存客户端请求缓存和数据库中都不存在的数据,导致请求每次都穿透缓存直达数据库,数据库反复查询不存在的数据,最终被拖垮。
1. 当数据库查询不到数据时,将该键的空结果缓存到 Redis,设置较短的过期时间(如 5 分钟)示例:SET key "" EX 300,避免相同键重复穿透2. 注意:空值缓存会占用少量内存,需控制过期时间和键数量一个热点缓存键(如秒杀商品、热门新闻)在某一时刻过期,恰好此时有大量请求访问该键,所有请求瞬间穿透到数据库,导致数据库压力骤增。
区别于雪崩:击穿是单个热点键过期,雪崩是大量键集体过期。
1. 核心热点键不设置过期时间,由后台异步任务定期更新缓存数据2. 示例:秒杀商品的库存缓存,通过定时任务从数据库拉取最新库存更新 Redis特性 | 缓存雪崩 | 缓存穿透 | 缓存击穿 |
|---|---|---|---|
故障对象 | 大量缓存键 | 不存在的缓存键 | 单个热点缓存键 |
核心原因 | 集体过期 / 缓存宕机 | 缓存 + 数据库无此数据 | 热点键过期 + 高并发访问 |
影响范围 | 整个缓存层失效,数据库全面承压 | 数据库空查询压力大 | 数据库单点查询压力大 |