缓存击穿、穿透、雪崩到底差在哪:一张表分清,再给组合解法

简介: 缓存击穿、穿透、雪崩名字相近却成因不同。本文用一张表彻底区分:击穿是单个热点key过期瞬间、穿透是查询根本不存在的数据、雪崩是大批key同时失效或缓存宕机,并分别给出互斥重建与逻辑不过期、空值缓存与布隆过滤器、TTL随机抖动与多级缓存熔断降级的组合解法,最后给出三者协同布防的工程建议和上线自检清单。

做高并发读多写少的业务(商品详情、活动配置、类目树都属于这一类),几乎一定会用缓存挡数据库压力。但"加了 Redis"不等于高枕无忧,缓存击穿、缓存穿透、缓存雪崩这三个名字相近的问题,成因和解法完全不同,很多人面试能背、线上却用混。本文先把三者彻底分清,再讲生产环境怎么组合落地。

一、一张表分清三个概念

问题 触发时刻 查询的数据 后果 核心解法
缓存击穿 某个热点 key 过期瞬间 数据库里存在 大量并发同时打到这一条记录 互斥重建 / 热点永不过期
缓存穿透 任意时刻持续请求 数据库里根本不存在 缓存永远拦不住,直打数据库 缓存空值 / 布隆过滤器
缓存雪崩 大批 key 同时过期或缓存宕机 大量存在的数据 成片请求同时压垮数据库 过期时间加随机 / 多级缓存 / 降级

一句话记忆:击穿是"一个热点刚好过期",穿透是"查的数据压根没有",雪崩是"一大批一起失效"。

二、缓存击穿:只放一个线程去重建

热点 key 在过期的那一瞬间,成百上千个请求同时发现缓存没了,又同时去查库、回写缓存,数据库瞬间被同一条 SQL 打满。解法是让重建过程互斥,只允许一个请求查库:

async function getHotData(key) {
   
  let data = await redis.get(key);
  if (data) return JSON.parse(data);

  // 抢锁:抢到的去查库重建,没抢到的短暂等待后重读缓存
  const locked = await redis.set('lock:' + key, 1, 'NX', 'PX', 3000);
  if (locked) {
   
    try {
   
      data = await db.query(key);          // 只有一个线程查库
      await redis.set(key, JSON.stringify(data), 'EX', 600);
    } finally {
   
      await redis.del('lock:' + key);
    }
  } else {
   
    await sleep(50);
    data = await redis.get(key);           // 等重建者回写后读缓存
  }
  return data && JSON.parse(data);
}

对超级热点(首页爆款、秒杀商品),更简单的做法是逻辑不过期:缓存本身不设 TTL,由后台任务异步刷新,用户线程永远只打缓存。

三、缓存穿透:让"不存在"也被挡住

攻击者或异常客户端反复查数据库里不存在的 id(比如商品 id 从 -1 一路扫下去),由于数据不存在,缓存永远写不进去,每次都落库。两种解法:

  1. 缓存空值:查库为空也写一个标记(如 null)并设较短 TTL,下次同样的查询直接被缓存挡住,简单直接;
  2. 布隆过滤器:在缓存前再加一层,把所有合法 id 预先放进布隆过滤器,请求进来先判断"这个 id 可能存在吗",明确不存在的直接返回,连缓存都不查。
async function getProduct(id) {
   
  if (!bloomFilter.maybeExists(id)) return null;   // 一定不存在,直接挡掉
  const cached = await redis.get('prod:' + id);
  if (cached === 'NULL') return null;              // 空值缓存命中
  if (cached) return JSON.parse(cached);
  const prod = await db.findProduct(id);
  // 不存在也缓存,TTL 短一些,避免真实数据稍后创建后长时间查不到
  await redis.set('prod:' + id, prod ? JSON.stringify(prod) : 'NULL', 'EX', prod ? 600 : 60);
  return prod;
}

布隆过滤器有误判(可能把不存在判成可能存在)但不会漏判,正好适合做前置拦截;参数校验(如 id 必须为正)要在最外层先做,挡掉明显非法请求。

四、缓存雪崩:别让 key 们"约好一起过期"

雪崩有两个来源,分别应对:

  • 大批 key 同时失效:给 TTL 加随机抖动,让失效时间打散。EX = 基础时间 + random(0, 300秒),避免批量预热的缓存在同一刻集体过期;
  • 缓存节点整体宕机:靠多级缓存(本地缓存 + 分布式缓存)兜底、集群高可用,以及数据库侧的限流与降级,保证缓存全挂时数据库也不会被瞬时流量直接压垮。

此外要给缓存调用加超时和熔断,缓存慢的时候不能把请求线程全部拖死;数据库侧配置最大连接数和降级返回(如兜底静态数据),守住最后一道线。

五、踩坑清单

  • 把穿透当击穿,给不存在的数据加互斥锁,纯属无效;
  • 互斥重建忘记释放锁或没设过期,死锁卡住所有请求;
  • 空值缓存 TTL 设太长,新创建的数据迟迟查不到;
  • 布隆过滤器不随新增数据更新,误判越来越多;
  • 批量预热用同一个 TTL,上线后整刻钟周期性抖动;
  • 缓存不可用时无限重试,把数据库一起拖垮。

六、工程落地建议

实际系统里这三者往往要组合使用:入口先做参数校验和布隆过滤(防穿透),热点 key 用互斥重建或逻辑不过期(防击穿),全部 key 的 TTL 加随机抖动、配多级缓存和熔断降级(防雪崩),再配合缓存命中率和数据库慢查询监控,才能在大促流量下稳住。成型的商城系统通常已把这套缓存防护、限流降级封装在商品与详情链路里(如基于成型平台的商品缓存能力,如乔拓云商城),自研时重点把三种场景区分清楚、分别布防。

七、上线自检清单

  1. 热点 key 过期瞬间,查库 SQL 是否只执行一次;
  2. 反复查不存在的 id,数据库是否零压力;
  3. 缓存 TTL 是否带随机、不存在整刻同时失效;
  4. 缓存宕机时是否有本地缓存、限流和降级兜底;
  5. 空值缓存的 TTL 是否短于正常数据。

三个问题名字像,但本质分别是"热点过期、数据不存在、批量失效",先分清是哪一类,再对症下药,比堆砌方案重要得多。以上为个人工程实践总结,具体参数请结合自身流量压测确定。

相关文章
|
2月前
|
缓存 监控 小程序
小程序发版总翻车?灰度发布、实时监控与快速回滚的落地设计
小程序发版最怕三件事:全量发布直接崩、出问题回滚慢、用户手机里一直是旧版本。本文给一套发版流程设计:体验版到提审到灰度再到全量的关卡划分、灰度比例与自动放量、监控卡点与快速回滚、版本号与缓存更新策略,附发版检查清单与配置表。适用于小程序/轻应用产品的版本发布管理。
|
3月前
|
人工智能 自然语言处理 供应链
API接口:为AI装上“手脚”,打通数字世界的“任督二脉
API是AI的“神经系统”与“执行层”,赋能大模型从思考走向行动。作为AI Agent调用外部工具的核心载体,它支撑任务拆解、工具调用与结果整合。通过统一接入、MCP协议、API网关等模式,API正构建繁荣AI生态,并在电商等场景实现智能选品、对话购物与供应链协同。
|
4月前
|
人工智能 自然语言处理 BI
阿里云QoderWork完全指南:从入门到精通,打造全能AI工作搭档
QoderWork是阿里云Qoder团队打造的桌面端AI智能体工具,定位为可自主执行多步骤任务的“AI实习生”,能在本地环境完成文件管理、数据处理、文档生成、办公自动化等全场景工作,无需复杂命令,用自然语言即可驱动。它以本地沙盒运行、细粒度权限控制、可扩展Skill系统、多模型自由切换为核心优势,完美适配个人办公、团队协作与企业级任务需求,是替代传统AI助手、提升工作效率的全能搭档。本文从核心定位、安装配置、核心功能、模型接入、Skill开发、实战技巧、常见问题等维度,提供从入门到精通的完整指南,帮助用户快速掌握并最大化发挥QoderWork的价值。
1515 5
|
3月前
|
人工智能 自然语言处理 安全
掌握RAG、Agent、函数调用、MCP、A2A全核心技术,AI应用架构设计能力完全解析21.1
本文系统阐述大模型应用开发的全栈技术体系:从提示词工程、RAG检索增强、Function Calling工具调用,到Skills模块化封装、MCP标准化通信、Agent自主规划及A2A多智能体协作,最终构建高可用、安全可控的生产级AI架构,助力企业实现从“简单问答”到“智能业务执行”的跃迁。
169 4
|
4月前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
6342 220
|
20天前
|
网络协议 关系型数据库 数据安全/隐私保护
弱口令候选验证 POC:Python + Nuclei
本工具包提供20个Python服务适配器与16个Nuclei YAML模板,专注验证468条已核实的出厂默认凭据。支持HTTP/TCP协议及SSH/MySQL等可选驱动,严格限制为授权单点测试,不枚举、不爆破、不执行命令,确保低影响合规检测。(239字)
|
3月前
|
人工智能 运维 数据可视化
通义千问Qwen3.8‑Max深度解析:MoE旗舰大模型全能力与API实战教程
大模型技术快速迭代,行业需求已经从简单问答对话,转向可以独立完成复杂工程、长周期任务、多模态综合处理的自主智能体。Qwen3.8‑Max作为通义千问系列定位最高的旗舰版本,采用2.4万亿总参数第三代MoE稀疏混合专家架构,搭配百万级Token超长上下文窗口,实现原生多模态融合,完成从AI辅助工具向自主执行智能体的能力跨越。它不仅在代码工程、专业办公、数理科研推理领域实现大幅度性能跃升,还具备端到端交付生产级业务成果的实力,为个人开发者、企业研发团队、科研机构提供高性能AI生产力底座。本文从底层技术架构、五大核心能力矩阵、真实业务场景、多套可直接运行的API代码示例、接入方式等维度完整展开,帮助
987 2
|
5月前
|
人工智能 缓存 运维
CC Switch路由代理技术解析:Codex CLI无缝对接DeepSeek模型实操指南
在现代AI开发与命令行智能编程场景中,Codex CLI是开发者常用的命令行智能辅助工具,能够实现代码生成、问题排查、脚本编写、项目调试等自动化能力。但原生Codex CLI存在明显的适配局限,其底层仅兼容OpenAI Responses API协议,无法直接对接DeepSeek等主流第三方大模型。市面上绝大多数第三方开源、商用大模型均采用Chat Completions API协议,两种协议在请求结构、参数格式、流式返回规则、响应字段定义上完全不互通,直接填写第三方模型接口地址会出现接口404报错、参数解析失败、流式内容中断、模型列表加载异常等各类问题,极大限制了Codex CLI的模型拓展
1057 1
|
4月前
|
人工智能 监控 测试技术
银行业AI架构:从裸调API到六层技能体系
# 银行AI智能体架构实战:从单体到Skill协同的技术演进 ## 痛点:银行IT架构的三重困境 走在任何一家银行的科技部走廊里,你都能听到同样的叹息:系统又慢了、需求又排不上、监管又来查了。这不是某一家银行的困境,而是整个银行业IT架构的共性问题。我们把它拆解为三重困境。 **困境一:单体系
|
4月前
|
人工智能 API 数据库
Kimi深夜突袭K3,2.8万亿参数超大水桶!直接跨入世界第一梯队!
老金我昨儿在网上瞎逛的时候,突然看到了Kimi K3的消息。 合计先打开官网看看开发者文档有没有啥信儿,结果刚打开官网,好家伙。。就看到已经上线了! ![Image](https://ucc.alicdn.com/pic/developer-ecology/p3shvhj26rigq_0488c34b2827443e9b77df8ee1e3a066.png) Kimi官网Chat窗口里已