3. TTL 与过期策略

TTL(Time To Live)是缓存系统中控制数据有效期的核心机制。设置不当会导致缓存击穿、雪崩或内存浪费;扫描机制与时间精度则决定了系统在高并发下的行为一致性。本章围绕 TTL 设置原则、过期扫描机制、时间精度影响三个维度展开,明确系统边界与分层职责。

3.1 TTL 设置原则

TTL 的赋值不应是随意数字,而应综合业务容忍度、数据更新频率、系统负载三个维度进行决策。以下是经过验证的六条原则:

  1. 业务差异化原则:热点数据可设置较长 TTL(如用户会话 30 min),冷数据或不常变数据可设置 1 h 以上。
  2. 分钟级粒度原则:避免使用秒级 TTL 引发频繁过期扫描,推荐以分钟为基本单位,如 5 min、30 min。
  3. 阶梯衰减原则:对同一类数据按访问热度分层,热度越高 TTL 越长,热度降低后逐步缩短。
  4. 抖动消除原则:在基础 TTL 上叠加 ±10% 随机偏移,防止大量 key 同时过期造成缓存雪崩。
  5. 失效前预热原则:对于聚合计算结果,TTL 设置应预留 2–3 个后台刷新周期,确保重建时间窗口内不返回旧数据。
  6. 资源水位原则:内存占用超过 70% 时,应主动调低非关键数据的 TTL,优先保留高频热点。
典型案例:某电商商品详情页缓存,设置 TTL=600s + 随机数 (-60, +60)s。高峰期命中率稳定在 98.5%,未出现集群内存突降。

3.2 过期扫描机制

常见的过期扫描策略分为三类,不同系统可能有混合实现。下表对比了三种机制的核心差异:

机制 触发时机 精度 CPU 开销 典型系统
惰性删除 每次访问 key 时检查是否过期 粗 低(仅访问时有开销) Redis
定时扫描 独立后台线程按固定间隔扫描 中 中(需权衡间隔) Memcached、本地缓存
懒汉+定期混合 结合惰性删除与周期扫描 高 较高(需限流避免抖动) Redis、Caffeine
风险提示:纯惰性删除会导致“过期 key 堆积”,在大量 key 到期后仍未访问时引发内存泄漏;定时扫描间隔过短对 CPU 造成频繁中断,间隔过长则浪费内存。生产环境必须使用混合策略并限速。

3.3 时间精度对系统影响

TTL 依赖系统时钟,时间精度问题会引发以下三类异常:

  • 时钟漂移:分布式节点间时钟不同步,导致同一 key 在不同节点上的剩余 TTL 不一致,引发读写路由错乱。
  • 粒度浪涌:秒级 TTL 在整秒时钟边界集中触发过期,产生“时间戳毛刺”,瞬间压力峰值可达均值的 5–8 倍。
  • 精度取舍:毫秒级 TTL 可满足金融领域精确控制,但需要高精度时钟服务(如 PTP),普通业务采用秒级即可。
验收标准:设置千级并发测试,连续运行 1 小时,各节点时钟偏差 ≤100 ms;过期 key 数每 10 秒波动不超过平均值的 ±30%;整体内存占用保持在配置上限的 60%–80% 之间。

3.4 策略选型决策树

下方 SVG 图展示了从业务场景到最终配置的推导路径,帮助架构师在系统设计阶段快速定位合适的 TTL 与扫描策略组合。

TTL与过期策略选型决策树 业务场景分析 高频热点数据 低频/冷数据 阶梯 TTL + 随机抖动 (基础 600s ±60s) 短 TTL + 惰性删除 (3600s,依赖主动刷新) 混合扫描(懒+定时) 秒级精度(普通业务) 或 毫秒级(金融) 决策依据:数据访问频次 → TTL 粒度 → 扫描方式 → 时钟精度,层层对应,不可跳级

3.5 落地步骤与验收标准

  1. 步骤一:业务归类——将缓存数据按访问热力图分为 hot / warm / cold 三类,为每类设置基准 TTL。
  2. 步骤二:抖动配置——在配置中心添加随机偏移参数,例如 ttl.jitter.percent=10。
  3. 步骤三:扫描引擎选型——若使用 Redis,启用 activerehashing yes 与 hz 10;若用本地缓存,实现一个独立 Timer 线程,扫描间隔为 TTL 平均值的 1/10。
  4. 步骤四:时钟同步——所有缓存节点部署 NTP 并开启 PTP(精度需求 ≤50 ms 时)。
  5. 步骤五:压测验证
# 模拟 5000 key 并发写入,TTL 随机分布在 300~900s
wrk -t12 -c400 -d60s --latency http://127.0.0.1:6379/cache/set?ttl=random-600
# 观察过期 key 分布是否均匀(预期:每 10s 过期 key 数 ≤ 200)
redis-cli info keyspace | grep expires
验收标准:
- 各节点间时钟偏差 ≤ 50 ms(适用于毫秒级业务)或 ≤ 200 ms(秒级业务)。
- 连续 30 分钟压测,最多出现 3 次过期 key 数突增超过均值 2 倍。
- 缓存命中率稳定在 97% 以上,内存波动幅度 ≤ 15%。