1. 缓存失效的基本模型

1.1 缓存失效的定义

缓存失效是指在缓存系统中使已存储的数据副本变为无效、过期或不可用的操作。作为缓存与持久化存储之间的核心边界控制点,失效确定了数据在缓存层中的生命周期终点。
从架构分层职责看,缓存层负责加速读访问,持久化层保证完整性与一致性,而失效机制则充当二者之间的控制流闸门。

核心概念:失效不是删除数据,而是标记或移除缓存中“不再可信”的副本,触发后续的数据重新加载或穿透。

1.2 常见触发条件

触发条件描述典型场景
TTL 超时缓存项设置了生存时间,到期自动失效用户会话、临时验证码
主动失效业务代码显式调用失效接口更新商品信息后删除对应缓存键
容量淘汰缓存空间不足时按策略淘汰LRU/LFU 淘汰最近最少使用项
数据源变更数据库或上游服务发生写操作订单状态变更、库存变化
版本不匹配缓存数据版本落后于持久化版本分布式场景下的版本号比对

1.3 失效后的数据流

失效发生后,数据流遵循“缓存未命中 → 回源加载 → 更新缓存 → 返回响应”的基本路径。下图展示了典型的失效后数据流与分层职责。

缓存失效后的数据流与分层职责 客户端请求 读操作 缓存层读 检查缓存 缓存命中? 判断条件 返回缓存数据 直接响应 数据源回源 查数据库/上游 更新缓存 写入新数据 返回最新数据 响应客户端 说明:失效触发后,缓存层进入“未命中”路径,经数据源回源、更新缓存,最终返回一致的最新数据

1.4 失效后的数据流步骤

  1. 客户端发起读请求:携带缓存键(如 user:1234:profile)。
  2. 缓存层检查:根据 TTL / 状态判断该键是否有效。若命中且未过期,直接返回缓存副本(结束)。
  3. 触发失效行为:若过期、被淘汰或主动失效,标记为不可用,将请求穿透到数据源。
  4. 数据源回源:从持久化层(MySQL / DynamoDB / 上游服务)获取最新完整数据。
  5. 更新缓存:将新数据写入缓存层,并重置 TTL 或版本号。
  6. 响应客户端:返回最新数据,后续相同请求将从缓存中直接获得。

1.5 风险点与策略权衡

风险点说明典型应对策略
缓存穿透大量请求访问不存在的数据,绕开缓存直击数据库布隆过滤器 / 空值缓存
缓存击穿热点数据失效瞬间,大量请求并发回源互斥锁 / 预加载 / 永不过期+异步更新
缓存雪崩大量缓存同时失效,引发数据库负载飙高TTL 随机化 / 多级缓存 / 限流
数据不一致失效后回源竞争导致旧数据被重新缓存版本号 / CAS 写 / 消息队列顺序更新

1.6 落地步骤与验收标准

落地步骤:

  • 定义缓存键命名规范与 TTL 范围(如 5~30 分钟)。
  • 代码中封装统一的失效接口(del(key) / expire(key, ttl))。
  • 对每个数据源变更操作,同步触发对应缓存键失效。
  • 部署监控:缓存命中率、回源延迟、淘汰次数。

验收标准:

  • 失效后首次读取返回新数据(验证 TTL 和主动失效)。
  • 并发回源时数据库连接数不超过阈值(如 100 QPS)。
  • 缓存命中率在业务高峰期不低于 90%。
  • 模拟雪崩场景(批量失效)下系统响应时间 ≤ 500ms。
架构决策要点:失效策略必须与业务隔离级别对齐——读多写少场景优先选 TTL + 预加载,写高频场景优先主动失效 + 异步一致。本章模型为后续所有失效策略(LRU、LFU、预失效、延迟失效等)提供通用数据流基础。