2. 缓存基础理论:本地缓存与分布式缓存对比,缓存穿透、缓存击穿、缓存雪崩的定义与危害

2.1 本地缓存 vs 分布式缓存:核心差异

在 Development 环境中,缓存选型直接影响数据一致性的治理成本。本地缓存与分布式缓存在部署形态、数据共享、性能特征上存在本质区别,下表从 7 个关键维度进行对比:

对比维度 本地缓存(Local Cache) 分布式缓存(Distributed Cache)
部署位置 与应用进程同 JVM / 同进程内存 独立部署的缓存中间件集群
数据共享 进程内独享,多实例间不共享 所有应用实例共享同一缓存空间
访问延迟 纳秒级(纯内存指针访问) 毫秒级(网络 I/O + 序列化)
容量上限 受限于单机堆内存(通常 ≤ 几 GB) 可水平扩展至 TB 级
一致性模型 强一致(单线程/单进程内) 最终一致(需额外协调)
典型实现 Caffeine, Guava Cache, Ehcache Redis, Memcached, Hazelcast
开发环境适用场景 配置信息、字典表、不常变的热点数据 会话状态、业务缓存、跨服务共享数据
开发环境选型建议: 本地缓存适合「读多写极少、单实例可见」的数据;分布式缓存适合「多实例共享、需要一致性闭环」的数据。在 Development 阶段,建议优先使用本地缓存降低复杂度,仅在出现跨实例数据不一致问题时才引入分布式缓存。

2.2 缓存穿透(Cache Penetration)

定义: 请求查询一个缓存中不存在、数据库中也不存在的数据。每次请求都直接穿透缓存打到数据库,导致缓存完全失效。

  • 典型场景: 恶意攻击者持续请求不存在的用户 ID(如负数 ID、超长 ID),或系统 bug 导致查询条件错误。
  • 危害: 数据库连接池被耗尽,引发上游服务超时雪崩;严重时直接导致数据库宕机。
  • 治理思路: 布隆过滤器前置拦截 + 空值缓存(短 TTL)+ 参数校验。

2.3 缓存击穿(Cache Breakdown)

定义: 一个热点 key 在缓存过期失效的瞬间,大量并发请求同时涌入,全部穿透到数据库加载数据。

  • 典型场景: 秒杀商品详情页、微博热搜榜、爆款文章阅读量。单个 key 承载了 90% 以上的流量。
  • 危害: 数据库瞬间被高并发打爆,即使只有 1 个 key 失效,也可能拖垮整个数据库节点。
  • 治理思路: 互斥锁(Mutex Key)保证只有一个线程回源数据库;或使用逻辑过期 + 异步刷新。

2.4 缓存雪崩(Cache Avalanche)

定义: 大量缓存 key 在同一时间集中过期失效,或缓存节点整体宕机,导致海量请求直接压向数据库。

  • 典型场景: 缓存服务重启后所有 key 同时过期;或设置了相同的固定过期时间(如凌晨 0 点统一失效)。
  • 危害: 数据库流量瞬间飙升数十倍,引发级联故障,整个服务链路不可用。
  • 治理思路: 过期时间加随机偏移(基础 TTL + 随机值);缓存集群高可用(主从 + 哨兵/集群模式);本地缓存兜底 + 限流熔断。
开发环境常见误区: 很多开发者在本地调试时只设置 1~2 个缓存 key,无法复现雪崩场景。建议在 Development 环境通过「批量过期模拟工具」主动触发雪崩,验证限流和降级策略是否生效。

2.5 三种异常对比总览

异常类型 根因 影响范围 数据库压力特征 核心治理手段
缓存穿透 查询不存在的数据 单个 key 持续穿透 恒定低 QPS 但持续消耗连接 布隆过滤器 + 空值缓存
缓存击穿 热点 key 过期瞬间 单个热点 key 瞬时爆发 瞬间极高 QPS 峰值 互斥锁 / 逻辑过期
缓存雪崩 大量 key 同时过期 / 缓存宕机 全局性流量冲击 持续高 QPS 直至崩溃 过期时间随机化 + 高可用 + 限流

2.6 缓存异常链路示意图

下图展示了三种缓存异常在请求链路中的不同表现位置与数据库压力形态:

缓存穿透、击穿、雪崩链路对比 缓存穿透 / 击穿 / 雪崩 请求链路对比 客户端请求 缓存层 数据库层 穿透 击穿(热点 key 过期) 雪崩(大量 key 同时过期) 数据库压力特征 穿透:恒定低 QPS 持续消耗连接 击穿:瞬间极高 QPS 峰值 雪崩:持续高 QPS 直至崩溃

2.7 开发环境治理优先级矩阵

在 Development 阶段,建议按以下优先级逐步建立缓存治理能力:

  1. 第一优先级: 参数校验 + 空值缓存(解决穿透,成本最低)
  2. 第二优先级: 热点 key 互斥锁 + 逻辑过期(解决击穿,对性能影响可控)
  3. 第三优先级: 过期时间随机化 + 本地缓存兜底(解决雪崩,需要架构配合)
  4. 第四优先级: 布隆过滤器 + 限流熔断(兜底防御,防止极端情况)
开发环境验证技巧: 使用 JMeter 或 Locust 构造「不存在 key 请求」「热点 key 并发过期」「批量 key 同时过期」三种压测场景,观察数据库连接池水位和响应时间曲线,即可快速验证治理效果。