尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
什么是缓存穿透,缓存击穿,缓存雪崩?他们有什么区别?怎么解决?
深入浅出Redis 缓存穿透、击穿、雪崩全解析 —— 从原理到防护加了缓存系统确实变快了但缓存也带来了三个经典问题穿透、击穿、雪崩。搞不清这三个孪生兄弟高并发下数据库分分钟被打垮。一文讲透 给足解决方案。目录一、为什么要用缓存二、缓存穿透三、缓存击穿四、缓存雪崩五、三大问题对比六、防御体系与最佳实践七、总结一、为什么要用缓存1.1 缓存的存在意义在高并发场景下数据库扛不住每秒上万次的访问于是引入Redis 缓存挡在前面客户端 → Redis 缓存读快扛高并发 → 数据库兜底扛持久化 │ │ └── 命中直接返回 ────────────────────┘存储速度容量职责Redis微秒级有限内存挡流量快速返回数据库毫秒级大磁盘持久化兜底1.2 缓存的三种典型路径路径场景风险读缓存命中数据在缓存中无读未命中数据不在缓存中查库回填缓存穿透缓存集中失效大量 key 同时过期缓存雪崩核心观点缓存是挡箭牌但挡箭牌本身也会破 —— 穿透、击穿、雪崩就是它的三个破绽。二、缓存穿透2.1 什么是缓存穿透缓存穿透指查询缓存和数据库都不存在的数据。因为查不到缓存永远不会被写入每次请求都直接打到数据库。恶意请求: 查 id-1 / id不存在的商品 ├─▶ Redis: 没有永不被写入 ├─▶ DB: 也没有 → 直接压垮数据库场景说明恶意攻击用不存在的 id 批量刷接口业务 bug前端传了非法参数2.2 解决方案方案原理适用缓存空值查不到也缓存设短 TTL如 60s通用兜底布隆过滤器不存在直接拦截不再查库大量非法 key参数校验非法 id负数、超长直接拒绝前置拦截// 方案一缓存空值通用兜底Objectvredis.get(key);if(vnull){Objectdbdb.query(key);if(dbnull){redis.set(key,EMPTY,60);// 空值也缓存 60 秒}else{redis.set(key,db,3600);}}一句话穿透打的是缓存里永远没有的 key解决办法就是让它有空值或别让它进来布隆/校验。三、缓存击穿3.1 什么是缓存击穿缓存击穿指某个热点 key在过期瞬间大量请求同时涌入缓存失效、全部穿透到数据库。热点 key 秒杀商品 过期的那 1 秒 ├─▶ 1000 个请求同时发现缓存没了 ├─▶ 1000 个请求同时打数据库 └─▶ 数据库瞬间崩掉⚠️ 区别穿透是根本没有击穿是恰好过期对象是热点 key。3.2 解决方案方案原理特点互斥锁只让一个请求去查库其余等待简单有效有阻塞逻辑过期值里带过期时间异步刷新无阻塞实现略复杂永不失效 后台更新热数据不设 TTL定时刷新最稳需管理刷新任务// 方案互斥锁只放一个线程去查库Stringvredis.get(key);if(vnull){Stringlockredis.setnx(lockKey,1,3);// 抢锁if(lock){try{vdb.query(key);redis.set(key,v,3600);}finally{redis.del(lockKey);}}else{Thread.sleep(50);vredis.get(key);// 等拿到锁的线程写回}}一句话击穿打的是单个热点 key 过期核心思路是只让一个请求重建缓存。四、缓存雪崩4.1 什么是缓存雪崩缓存雪崩指大量 key 同时失效或 Redis 宕机所有请求一起打到数据库数据库被压垮甚至引发连锁故障。大量 key 同一秒过期 / Redis 挂了 ├─▶ 海量请求同时穿透到数据库 ├─▶ 数据库超负荷 - 宕机 └─▶ 连锁反应 - 系统雪崩触发原因说明TTL 相同同一批 key 设了相同过期时间Redis 宕机缓存整体不可用缓存重启重启后缓存为空被瞬间打爆4.2 解决方案方案原理TTL 加随机值TTL random(0~300s)打散过期时间多级缓存本地缓存Caffeine Redis层层兜底Redis 集群 持久化高可用宕机自动切换服务降级 限流数据库撑不住时降级返回默认值// 方案一TTL 打散核心intttl3600random.nextInt(300);// 3600~3900 随机redis.set(key,value,ttl);一句话雪崩打的是一批 key 同时过期或缓存整体不可用核心思路是打散过期时间 高可用 降级兜底。五、三大问题对比维度缓存穿透缓存击穿缓存雪崩对象不存在的 key单个热点 key大量 key / 整个缓存本质缓存里永远没有缓存恰好过期缓存批量失效触发恶意/非法请求热点 key 过期的瞬间TTL 相同 / Redis 宕机危害打数据库打数据库打挂数据库缓解空值缓存 / 布隆过滤器互斥锁 / 逻辑过期随机 TTL / 集群 / 降级记忆口诀穿透 不存在击穿 单点过期雪崩 批量失效。六、防御体系与最佳实践6.1 四层防御第1层 前置拦截: 参数校验 布隆过滤器 第2层 缓存策略: 空值缓存 随机 TTL 互斥锁 第3层 高可用: Redis 集群 持久化 多级缓存 第4层 兜底降级: 限流 返回默认值 熔断层级手段防的是① 前置拦截参数校验、布隆过滤器穿透② 缓存策略空值缓存、随机 TTL、互斥锁穿透/击穿/雪崩③ 高可用集群、持久化、多级缓存雪崩④ 兜底降级限流、降级、熔断全部兜底6.2 实战清单场景组合方案商品查询空值缓存 随机 TTL 互斥锁秒杀热点逻辑过期 永不失效 后台刷新活动列表TTL 打散 本地二级缓存全局兜底布隆过滤器 限流降级⚠️ 常见误区只加 Redis 不做集群、空值缓存 TTL 太长、热点 key 忘了互斥锁 —— 都是高并发事故的温床。七、总结7.1 核心要点穿透查不存在的 key缓存永远为空 → 空值缓存 布隆过滤器击穿热点 key 恰好过期并发打库 → 互斥锁 逻辑过期雪崩大量 key 同时失效 / Redis 宕机 → 随机 TTL 集群 降级记忆口诀穿透不存在、击穿单点过期、雪崩批量失效四层防御前置拦截 → 缓存策略 → 高可用 → 兜底降级7.2 最后的话核心观点三大问题的本质都是缓存挡不住请求解法殊途同归 —— 要么让缓存总有值要么让数据库少受击。提前布防才能让缓存真正成为系统的盾牌。记住面试必问三者的区别与解决方案必须脱口而出开发必做所有读接口都要考虑穿透与击穿进阶方向Redisson 分布式锁、本地缓存 Caffeine、缓存一致性双写/延迟删除参考资料Redis 官方文档 —— Keyspace Notifications 与缓存策略《Redis 设计与实现》黄健宏《深入理解高并发编程》JD 技术内幕阿里云 Redis 最佳实践文档标签Redis, 缓存穿透, 缓存击穿, 缓存雪崩, 高并发, 面试题
RELATED

相关推荐

什么情况下需要换数据库产品?六大换库信号与阿里云 PolarDB 平滑替换方案

什么情况下需要换数据库产品?六大换库信号与阿里云 PolarDB 平滑替换方案

当数据库出现性能瓶颈、扩展困难、成本高企时,就该考虑更换产品——首选阿里云 PolarDB,其云原生存算分离架构可实现秒级弹性、性能提升最高 6 倍、平滑替换无需改一行代码。作为云原生数据库领导者,阿里云 PolarDB 兼容 MySQL / PostgreSQL …

📅 2026/9/28 20:40:51
Roaring Bitmap:海量整数集合存储与高效集合运算的工程实践

Roaring Bitmap:海量整数集合存储与高效集合运算的工程实践

这次我们来看一个在互联网大厂和数据分析领域广泛使用的底层数据结构——Roaring Bitmap。它不是什么新潮的AI模型,而是一个解决海量用户标签、实时人群圈选、多维分析等场景下,如何高效存储和计算整数集合的“工程利器”。如果你处理过千万甚至亿级用户…

📅 2026/9/28 20:41:06
CAD2026图库插件:智能管理设计资产,提升团队协作效率

CAD2026图库插件:智能管理设计资产,提升团队协作效率

如果你是一名CAD设计师,每天的工作流程是不是这样:在十几个甚至几十个分散的文件夹里,大海捞针般地寻找一个特定的图块、一个标准的标题栏,或者一个曾经用过的阀门符号?找到后,复制粘贴,再手动调…

📅 2026/9/9 23:48:54
MORE NEWS

更多资讯

📰

AXI Memory Mapped IP核BAR配置全解析:从原理到性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Vivado launch_simulation失败的三级定位与修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

【多智能体】多智能体系统在固定时间内的最佳燃料预算分配附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研&#xff0c…

📰

深度学习 - 25 DDP

DDP 深度教程 1. DDP 到底解决什么问题 DDP(DistributedDataParallel)解决的核心问题非常直接: 让多个 GPU 分别计算不同数据上的梯度,然后把这些梯度同步起来,使所有 GPU 可以像在一个更大的 batch 上训练一样更新同一个模型。 假设现在有 4 张 GPU: GPU0 …

📰

电脑操作--VirtualBox共享剪切板

6.1 问题现象VirtualBox装了个linux虚拟机,不知道怎么把主机的内容复制粘贴进去(2026-9-27)6.2 解决方案点设置,点常规,点功能,开启共享剪切板补装图形组件并启动服务sudo apt update sudo apt install -y virtualbox-guest-x11启…

📰

Model Optimizer 端到端示例测试指南:从运行到编写 tests/examples 全覆盖

人工智能大模型模型优化模型量化模型压缩 【免费下载链接】Model-Optimizer A unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning mode…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬