← 中文资源

简体中文版本

实现 stale-while-revalidate 缓存

先返回缓存结果并在后台刷新,同时限制最大陈旧时间,使用户获得快速读取又不至于长期读取过期数据。

阅读英文原文

概述

当略微陈旧的值可接受时,stale-while-revalidate 是读密集路径的正确默认。其价值完全取决于硬性陈旧上限与单飞刷新,否则延迟优势会变成正确性损失。

关键步骤

  1. 命中缓存时立即返回,并标记后台刷新。
  2. 异步刷新并写入带新时间戳的值。
  3. 超过最大陈旧时间后阻塞并回源。
  4. 对刷新做单飞,使并发读共享一次回源。

验证

  • 命中缓存时立即返回。
  • 后台刷新更新条目。
  • 超过上限的条目触发阻塞加载。
  • 并发读共享一次回源请求。

注意事项

  • 该策略以一致性换延迟,对必须精确读取的数据不适用。
  • 依赖后台机制,否则会退化为普通缓存。

适用范围

本条目围绕「实现 stale-while-revalidate 缓存」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。

async function get(k) {
  const hit = await cache.get(k);
  if (hit && Date.now() - hit.at < HARD_CAP) { void refresh(k); return hit.value; }
  return load(k);
}