缓存雪崩问题及解决方案
# 什么是缓存雪崩
缓存雪崩是 “大量 Redis Key 在同一时间过期,或 Redis 服务宕机,导致所有请求穿透缓存,集中查询数据库,数据库因无法承受高并发而崩溃” 的问题。与击穿(单个热点 Key)不同,雪崩是 “批量 Key 失效” 或 “缓存服务不可用”,影响范围更大。
# 解决方案
- 1. 避免 Key 集中过期:
- 过期时间加随机值:为每个 Key 的过期时间添加随机值(如
expire(key, 300 + new Random().nextInt(60))),使 Key 的过期时间分散在 300-360 秒之间,避免同一时间大量 Key 过期。 - 分层缓存:将缓存分为多层(如本地缓存 Caffeine + 分布式缓存 Redis),本地缓存设置较短过期时间,Redis 设置较长过期时间;当 Redis Key 过期时,先查本地缓存,再异步更新 Redis,减少数据库压力。
- 过期时间加随机值:为每个 Key 的过期时间添加随机值(如
- 2. 缓存服务高可用:
- Redis 集群:部署 Redis 主从集群(1 主 N 从)+ 哨兵(Sentinel),主节点宕机时,哨兵自动将从节点提升为主节点,确保 Redis 服务不中断;
- Redis Cluster:对于超大规模场景,部署 Redis Cluster(分片集群),将数据分散到多个主节点,即使某个主节点宕机,其他主节点仍可提供服务,降低单点故障影响。
- 3. 降级与限流:
- 服务降级:当 Redis 宕机或数据库压力过大时,通过降级策略返回默认值(如 “服务繁忙,请稍后重试”)或缓存的旧数据,避免数据库崩溃;
- 接口限流:通过网关(如 Spring Cloud Gateway、Nginx)对接口设置限流阈值(如每秒 1000 次请求),超过阈值的请求直接拒绝,保护数据库。
- 4. 数据持久化与快速恢复:
- 开启 Redis 的 AOF(Append Only File)和 RDB(Redis DataBase)持久化,AOF 记录所有写操作,RDB 定期快照;当 Redis 服务崩溃时,可通过 AOF 或 RDB 快速恢复数据,减少缓存数据丢失。
- 5. 熔断机制:
- 集成熔断组件(如 Sentinel、Hystrix),当数据库的请求失败率超过阈值(如 50%)时,自动熔断数据库请求,直接返回缓存旧数据或默认值;当数据库恢复正常后,再逐渐恢复请求。
上次更新: 12/30/2025