网站首页 > 技术文章 正文
缓存穿透、缓存击穿和缓存雪崩是高并发场景中常见的缓存问题,它们的核心区别在于触发原因和影响范围。以下是三者的详细对比和解决方案:
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 | 分散过期时间 + 多级容灾架构 |
猜你喜欢
- 2025-05-15 穿透与击穿:缓存世界的两场“攻击”,Java工程师如何见招拆招?
- 2025-05-15 一篇文章快速搞懂C++线程同步机制
- 2025-05-15 C语言编写多线程,什么时候要使用互斥锁?为什么要使用互斥锁?
- 2025-05-15 go语言并发原语RWMutex实现原理及闭坑指南
- 2025-05-15 实战经验:一次错误使用 go-cache 包导致出现的线上问题
- 2025-05-15 3. 复合数据类型
- 2025-05-15 Linux ALSA 音频系统:物理链路篇02
- 2025-05-15 聊聊并发编程: Lock
- 2025-05-15 Golang语言如何实现并行和并发
- 2025-05-15 C++防御性编程,提高代码的健壮性
- 最近发表
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- think in java (14)
- javascript权威指南 (19)
- nfs (25)
- componentart (17)
- yii框架 (14)
- springbatch (28)
- oracle数据库备份 (25)
- iptables (21)
- 自动化单元测试 (18)
- python编写软件 (14)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- dfn (14)
- http error 503 (21)
- pop3服务器 (18)
- 图表组件 (17)
- android退出应用 (21)