海量编程文章、技术教程与实战案例

网站首页 > 技术文章 正文

缓存击穿、缓存穿透、缓存雪崩这三者区别你清楚吗

yimeika 2025-05-15 22:55:38 技术文章 3 ℃

缓存穿透、缓存击穿和缓存雪崩是高并发场景中常见的缓存问题,它们的核心区别在于触发原因和影响范围。以下是三者的详细对比和解决方案:


1. 缓存穿透(Cache Penetration)

定义:查询数据库中不存在的数据(如非法ID或无效参数),绕过缓存直接请求数据库。

原因

  • 恶意攻击(如构造大量无效请求)
  • 业务逻辑漏洞(如未校验参数有效性)

影响

  • 数据库频繁响应无效查询,压力骤增
  • 可能成为DDoS攻击的突破口

解决方案

  • 布隆过滤器(Bloom Filter):预存合法Key的哈希值,拦截无效请求(存在极低误判率)
  • 空值缓存:对查询结果为空的数据也缓存(key:null),设置较短过期时间(如3-5分钟)
  • 参数预校验:业务层过滤非法参数(如非数字ID、越界范围)

2. 缓存击穿(Cache Breakdown)

定义热点Key突然失效时,大量并发请求直接穿透到数据库。

原因

  • 热点Key过期(如明星绯闻、秒杀商品)
  • 未对热点Key设置高可用策略

影响

  • 瞬时数据库压力过大,可能引发连锁故障

解决方案

  • 互斥锁(Mutex Lock):使用分布式锁(如Redis的SETNX),仅允许一个线程重建缓存,其他线程等待
  • 逻辑过期:缓存永不过期,后台异步更新缓存(如定时任务或消息队列触发更新)
  • 热点Key探测:监控高频访问Key,自动延长过期时间或标记为永久有效

3. 缓存雪崩(Cache Avalanche)

定义大量Key同时失效Redis集群宕机,导致请求全部转向数据库。

原因

  • 缓存数据设置相同过期时间(如批量缓存初始化)
  • Redis服务崩溃或网络分区

影响

  • 数据库负载激增,可能引发系统级联故障

解决方案

  • 随机过期时间:基础过期时间 + 随机值(如30min + random(0,300)s
  • 多级缓存架构:本地缓存(如Caffeine) + 分布式缓存(如Redis) + 数据库,逐层降级
  • 服务熔断降级:使用Hystrix或Sentinel熔断数据库访问,返回兜底数据
  • 集群高可用:Redis主从+哨兵模式,或Cluster模式实现故障自动转移

对比总结

问题类型

触发条件

影响范围

核心解决思路

缓存穿透

查询不存在的数据

单个Key

拦截无效请求 + 空值缓存

缓存击穿

热点Key失效

单个Key

互斥锁 + 逻辑过期

缓存雪崩

大量Key失效或缓存宕机

全局或批量Key

分散过期时间 + 多级容灾架构

Tags:

最近发表
标签列表