← 中文资源

简体中文版本

缓存雪崩预防工作流

通过抖动 TTL、提前刷新与单飞加载器预防键过期缓存雪崩,使一次未命中不淹没后端。

阅读英文原文

步骤与决策

键为何雪崩:固定 TTL 键在一瞬间过期,该瞬间所有并发读未命中同时加载后端,后端见一键 N 调用即雪崩。加 TTL 抖动:TTL 加随机抖动使键在窗口内过期非一瞬间,10% 抖动足以分散键群且不使有效 TTL 不可预测。加提前刷新:键被读时在过期前刷新使刷新在正常负载下非未命中风暴,80% 阈值给刷新在过期前完成时间。加单飞加载器:去重同键并发加载,首未命中启动加载存 promise,后续未命中 await 同 promise,后端见一调用。验证:100 并发读键过期后端仅 1 加载。

验证与后续

本缓存雪崩预防工作流的验证方法与后续步骤已在上文详述。本译文依据英文原文完整重写,步骤与命令与英文版本严格一致,可在本地按工作流步骤复现并核对结果。该工作流难度级别为intermediate,预计耗时约30分钟。若用于生产环境,请先结合自身环境调整参数与阈值,并确保团队熟悉相关工具链与操作流程。

代码示例

TTL = BASE + random(0, BASE * 0.1)
if (cache.ttl(key) < TTL * 0.2) refresh(key);  // refresh when 20% of TTL remains
if (!inflight.has(key)) inflight.set(key, load(key));
return inflight.get(key);