stale-while-revalidate:让过期缓存继续干活

缓存过期的那一刻通常是最慢的一次请求——用户要等着回源。stale-while-revalidate 把这个等待挪到了后台。

6 分钟缓存与命中
stale-while-revalidate:让过期缓存继续干活

要点

加上 stale-while-revalidate,过期后的第一个用户直接拿到旧副本,回源在后台进行。代价是这个用户看到的内容可能旧几秒。

本文目录
  1. 01过期瞬间的性能悬崖
  2. 02stale-while-revalidate 怎么解决
  3. 03什么时候不该用

过期瞬间的性能悬崖

一个 TTL 60 秒的资源,在这 60 秒里所有请求都从边缘直接返回,快得没话说。但第 61 秒的那个请求会命中一个已过期的副本,CDN 必须先回源取新内容,用户就得等完整的回源往返。

如果源站在另一个大洲,这一次等待可能是几百毫秒——而它恰好落在某个真实用户头上。TTL 越短,撞上这个悬崖的用户就越多。

stale-while-revalidate 怎么解决

Cache-Control: public, s-maxage=60, stale-while-revalidate=300

这行的意思是:60 秒内副本是新鲜的,直接返回;60 到 360 秒之间副本已过期,但仍然可以直接返回给用户,同时在后台发起回源更新。只有超过 360 秒才必须等回源。

时间用户拿到什么是否需要等待
0–60 秒新鲜副本不需要
60–360 秒旧副本(后台同时更新)不需要
360 秒以后回源取到的新内容需要

什么时候不该用

这是一次明确的取舍

开启后,过期窗口内的用户看到的是旧内容。对文章、商品列表、静态资源这类内容完全可以接受;对库存数量、价格、余额这类「读到旧值就是错」的数据不要用。

另外要注意 stale-if-error——它在源站返回 5xx 时继续供旧副本。这个通常值得开,它能让源站短暂故障不至于变成用户可见的错误页。

在你的网站验证

边缘核验检查你的资源是否已启用 stale-while-revalidate