一文搞懂redis缓存雪崩、缓存击穿和缓存穿透

一文搞懂redis缓存雪崩、缓存击穿和缓存穿透
最新回答
你与北诗

2022-04-11 11:43:58

Redis缓存雪崩、缓存击穿和缓存穿透的科普解析

缓存雪崩
缓存雪崩指大量请求因缓存失效或Redis服务故障直接涌入数据库,导致数据库压力骤增甚至崩溃。其核心原因包括:
1. 大量数据同时过期:若缓存中大量数据设置相同的过期时间,到期时所有请求无法命中缓存,全部转向数据库。解决方案

  • 随机过期时间:通过expire命令为数据设置基础过期时间后,叠加随机偏移量(如5分钟+10-120秒),避免集中失效。
  • 服务降级:非核心数据未命中缓存时直接返回预设值(如空值或错误信息),核心数据允许访问数据库,减少非必要请求对数据库的冲击。

2. Redis实例故障:Redis服务宕机或不可用时,所有读请求直接压向数据库。解决方案

  • 服务熔断与限流:熔断指暂停缓存访问,待Redis恢复后重新开放;限流通过控制QPS(如从2万/秒降至2千/秒)避免数据库过载。
  • 高可用集群:构建主从集群或哨兵模式,实现故障自动切换,提升服务可靠性。

缓存击穿
缓存击穿指高频访问的热点数据过期时,大量请求直接穿透缓存访问数据库。典型场景:热点数据(如热门商品信息)因过期失效,短时间内大量并发请求涌入数据库。解决方案

  • 永不过期策略:对热点数据不设置过期时间,待访问频率下降后手动清理。
  • 互斥锁机制:当缓存失效时,仅允许一个请求访问数据库并更新缓存,其余请求等待或返回旧值,避免并发冲击。

缓存穿透
缓存穿透指请求的数据既不在缓存也不在数据库中(如恶意查询不存在的ID),导致大量无效请求直接压垮数据库。核心原因

  • 数据误删:缓存和数据库中的数据被意外清除,但客户端持续请求。
  • 恶意攻击:通过构造非法请求(如查询超长ID)频繁访问不存在的数据。
    解决方案
  • 缓存空值:对查询结果为空的数据在缓存中设置短过期时间的空值,后续请求直接返回空值,避免重复查询数据库。
  • 布隆过滤器:通过哈希函数将数据映射到位数组中,标记存在性。查询时先检查布隆过滤器,若数据不存在则直接拦截请求,避免数据库访问。
  • 前端校验:在前端过滤非法请求(如参数格式错误、超长ID等),减少无效请求到达后端。

总结:缓存雪崩、击穿、穿透均会导致数据库压力激增,但成因不同。雪崩关注批量失效或服务故障,击穿聚焦热点数据失效,穿透则针对无效请求。通过随机过期、熔断限流、永不过期、布隆过滤器等策略,可有效降低风险,保障系统稳定性。