Administrator
Published on 2025-03-09 / 8 Visits
0
0

Redis 中的缓存击穿、缓存穿透和缓存雪崩

在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),保护后端服务。

对比总结

问题触发条件核心原因解决方案
缓存击穿热点数据过期 + 高并发单点热点失效永不过期、互斥锁、缓存预热
缓存穿透查询不存在的数据恶意攻击或非法参数布隆过滤器、空值缓存、参数校验
缓存雪崩大量缓存同时失效或服务宕机批量过期或系统故障随机过期时间、多级缓存、集群高可用

通过合理设计缓存策略、结合业务场景选择方案,可以有效应对这些问题,提升系统稳定性。


Comment