news 2026/8/31 21:25:52

缓存穿透、击穿和雪崩:别把三种问题混成一件事

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
缓存穿透、击穿和雪崩:别把三种问题混成一件事

缓存穿透、击穿和雪崩:别把三种问题混成一件事

缓存能够减少数据库读取,也能让高频页面更快返回。但缓存不是简单加在数据库前面就结束了。请求查不到数据、热点刚好失效、大量键同时过期、缓存服务本身异常,都会让流量重新落到后端。若团队把这些情况统称为“缓存崩了”,往往会套错方案:给不存在的数据加锁,给热点一味延长过期时间,或者只靠增加 Redis 容量来解决批量失效。

更稳妥的做法是先区分现象,再根据数据是否存在、热点程度、过期分布和后端承受能力设计防护。缓存策略应服务于业务正确性和可用性,不能为了提高命中率而返回不该返回的数据,或把过期数据无限期留在系统里。

穿透:先判断请求是否有意义

缓存穿透通常指请求查询的对象在缓存和数据源中都不存在。可能是用户输入错误、爬虫探测、接口被滥用,也可能是数据刚删除后仍有旧链接被访问。每次都直接查数据库,即使单次查询很轻,也会在高并发下形成持续压力。

处理前应确认“不存在”在业务上是什么意思。有些资源确实永远不可能存在,可以较早拒绝;有些对象则可能刚创建、尚未同步,过早判断不存在会影响正常用户。输入参数校验、权限校验和业务状态检查应放在合适位置,不能把所有未知标识一律当作攻击。

对可确认的无效请求,可以使用短期的空结果缓存,减少重复访问下沉。过期时间需要根据数据创建和删除的时效设计,不能无限保存。布隆过滤器等概率结构也可以用于较大规模的已知集合:它能可靠地排除某些不在集合中的键,但“可能存在”并不代表数据库一定有记录,后续仍要正常查询和处理。

击穿:关注的是单个热点重建

缓存击穿与穿透不同,它针对的是本来存在且访问量很高的对象。当一个热点键过期或失效时,很多请求同时发现未命中,并发回源加载同一份数据。后端压力集中在一个对象的重建上,常在活动页、热门内容或高频配置读取时出现。

第一步是识别真正热点,而不是给所有键加复杂锁。可以通过访问量、重建成本和业务重要性判断哪些对象需要特殊处理。普通键偶尔并发回源,可能并不值得引入额外协调;高热点且重建昂贵的键,才需要明确谁负责刷新、其他请求如何等待或降级。

一种策略是在缓存失效后只允许有限请求触发重建,其他请求短暂等待、返回受控的旧值,或给出可理解的稍后重试。锁或单飞机制只能协调重建过程,仍需要设置超时、失败处理和持有者身份,避免重建任务本身卡住时把所有请求长期阻塞。

逻辑过期是另一种思路:物理缓存保留数据,业务根据记录的更新时间决定它是否需要刷新。一个后台任务更新数据,其余请求在有限窗口内可以读取旧值。这适合能够接受短暂陈旧结果的场景,例如内容展示或非实时配置;对余额、库存和强实时状态则不应为了平滑而返回过期结果。

雪崩:看的是一批缓存同时失去作用

缓存雪崩涉及的不是单个热点,而是一大批键在相近时间失效,或缓存服务整体不可用。批量初始化时统一设置过期时间、定时任务集中刷新、发布时误删大范围键,都可能造成前者;单点部署、网络故障和容量耗尽则可能触发后者。

过期时间适度分散能够降低同时回源的概率,但它只是风险缓解,不是绝对保证。随机范围要结合业务过期要求设计,不能让需要准时更新的内容被随意拖延。更重要的是避免把大量关键键绑定到同一个刷新时刻,并对批量操作设置范围检查和回滚路径。

缓存服务故障时,后端需要有明确的保护策略。数据库连接池、并发预算、限流和降级可以防止所有请求一起冲向数据源;有些非关键功能可以暂时关闭或使用有限的本地结果。策略应区分接口优先级,不能让一项低价值查询挤占核心交易所需资源。

多副本、合理的客户端超时和故障切换有助于提高缓存服务可用性,但也要测试切换期间的行为。客户端无限重试或同步等待,可能在服务恢复前先把应用线程耗尽。

缓存数据的正确性要有边界

缓存中保存什么、何时更新、删除后怎样失效,都必须与数据写入路径协调。仅在读取端添加缓存,不处理写入后的更新或失效,会让用户长期看到旧数据。写后删除、更新缓存、事件驱动刷新等方式各有适用条件,需要结合并发写入和失败恢复设计。

不要把缓存当作权限判断的最终来源。个性化数据、账户状态和敏感信息需要按用户与权限隔离;缓存键或内容范围不清楚时,可能把一个用户的结果返回给另一个用户。命中率再高也无法弥补这种错误。

观测指标也应关注正确性:命中与未命中、回源时间、重建失败、空结果比例、过期数据读取和缓存服务错误,都能帮助判断策略是否在按预期工作。只有 QPS 和内存使用量,不足以说明缓存真的保护了后端。

用真实失败场景验证策略

上线前,可以在受控环境模拟几种关键情况:持续请求不存在对象、热点键同时过期、刷新任务失败、大批键需要重新加载、缓存节点短暂不可用。观察数据库是否仍在可承受范围内,用户是否得到适当反馈,数据是否会错误地长期陈旧。

发生异常后,团队应知道先保护什么、谁有权关闭某项缓存策略、如何恢复和核对数据。运行手册不必写得很长,但应避免现场临时执行大范围删除或无界重试。

缓存穿透、击穿和雪崩的共同点是都会增加回源压力,原因和处理方式却不同。先识别对象是否存在、是否是热点、是否会批量失效,再选择短期空值、受控重建、过期分散和后端保护,缓存才能在压力到来时真正发挥作用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 21:21:46

开源机器人商业化:从仓库到百万美元销售额的关键路径

Microduck 开源机器人销售额突破一百万美元的消息,在开源硬件社区里引起了不少讨论。这个数字之所以值得注意,不是因为它比商业机器人公司的体量大,而是因为它证明了一个经常被忽略的事实:开源项目同样可以走通从仓库到商品的完整…

作者头像 李华
网站建设 2026/8/31 21:20:59

手写数学公式识别:ResNet与Transformer端到端实现解析

简介:本资源是一套基于ResNet与Transformer混合架构的手写数学公式识别Python实现,面向深度学习初学者与计算机视觉方向进阶学习者,解决手写公式图像到LaTeX序列的端到端识别问题,适用于教育数字化、智能阅卷、学术笔记OCR等场景。…

作者头像 李华
网站建设 2026/8/31 21:20:31

可视化GUI自动操作实战:从批量录入到稳定性优化

简介:Automation Operation 2.60 是一款面向办公人员、测试工程师及低代码需求用户的可视化自动化操作工具,无需编程基础即可通过拖拽式GUI快速构建鼠标模拟、键盘输入、图像识别、OCR文字提取、浏览器控制等复杂流程,有效解决重复性操作、数…

作者头像 李华
网站建设 2026/8/31 21:19:58

MATLAB与ROS通信实战:让MATLAB成为ROS节点实现联合仿真

如果你的日常工作同时涉及 MATLAB 和 ROS,你大概率遇到过这种尴尬:算法在 MATLAB 里跑得好好的,一到真机或 Gazebo 环境就要重写一遍;ROS 端的节点已经把传感器数据发出来了,但 MATLAB 这边不知道怎么订阅;…

作者头像 李华
网站建设 2026/8/31 21:15:32

3C融合与工业自组网:构建去中心化的信息传输控制系统

“3C融合”这个词,在工业自动化语境里通常不是指消费电子产品融合,而是指计算(Computing)、通信(Communication)、控制(Control)三类能力的深度协同。如果你现在要构建一套“3C融合的…

作者头像 李华
网站建设 2026/8/31 21:14:42

2026多语言内容人必看:小语种配音AI工具选购指南,避开三大坑

2026年,多语言内容出海已经从“要不要做”变成了“怎么做才不出事”。去年广交会上,一个沙特客户听完阿拉伯语产品介绍视频后沉默了很久,最后说:“你们把折扣念成了冒犯词,在迪拜,这个词不能这么用。”——…

作者头像 李华