在Redis中,缓存击穿、缓存穿透和缓存雪崩是常见的缓存问题,它们的定义、原因及解决方案如下:
1. 缓存击穿(Cache Breakdown)
定义
当某个热点数据过期的瞬间,大量并发请求直接穿透缓存,直接访问数据库,导致数据库压力骤增。
原因
- 热点数据集中过期。
- 高并发请求同时查询同一数据。
解决方案
- 永不过期策略:对热点数据不设置过期时间,通过异步更新或逻辑过期(如字段标记过期时间)维护数据。
- 互斥锁(Mutex Lock):使用Redis的
SETNX
(或分布式锁)保证只有一个线程查询数据库并重建缓存,其他线程等待后重试。 - 缓存预热:提前加载热点数据到缓存,避免冷启动问题。
2. 缓存穿透(Cache Penetration)
定义
查询数据库中不存在的数据,导致每次请求都绕过缓存直接访问数据库(如恶意攻击使用非法ID)。
原因
- 恶意请求大量不存在的数据(如负数ID、随机字符串)。
解决方案
- 空值缓存:对查询结果为
null
的请求,缓存空值并设置较短过期时间(如5分钟)。 - 参数校验:在业务层过滤非法请求(如ID≤0、非数字格式)。
- 布隆过滤器(Bloom Filter):在缓存层前加布隆过滤器,快速判断数据是否存在,若不存在则直接返回,避免穿透到数据库。
3. 缓存雪崩(Cache Avalanche)
定义
大量缓存数据同时过期,或Redis服务宕机,导致所有请求直接访问数据库,引发数据库崩溃。
原因
- 大量缓存设置相同的过期时间。
- Redis集群故障或网络分区。
解决方案
- 随机过期时间:为缓存数据设置基础过期时间+随机偏移值(如
30分钟 + 随机0-10分钟
),避免同时失效。 - 高可用架构:使用Redis集群(如哨兵模式、Cluster模式)保障服务可用性。
- 多级缓存:结合本地缓存(如Caffeine)与分布式缓存(Redis),降低对单一缓存的依赖。
- 降级熔断:在数据库压力过大时,启用限流或熔断机制(如Hystrix),保护后端服务。
对比总结
问题 | 触发条件 | 核心原因 | 解决方案 |
---|---|---|---|
缓存击穿 | 热点数据过期 + 高并发 | 单点热点失效 | 永不过期、互斥锁、缓存预热 |
缓存穿透 | 查询不存在的数据 | 恶意攻击或非法参数 | 布隆过滤器、空值缓存、参数校验 |
缓存雪崩 | 大量缓存同时失效或服务宕机 | 批量过期或系统故障 | 随机过期时间、多级缓存、集群高可用 |
通过合理设计缓存策略、结合业务场景选择方案,可以有效应对这些问题,提升系统稳定性。