跳到主要内容

3. stale-while-revalidate Cache-Control Extension

当 stale-while-revalidate Cache-Control 扩展指令出现在 HTTP 响应中时, 它表示缓存可以在该响应变为过期之后, 继续提供该响应, 最长不超过所指示的秒数.

stale-while-revalidate = "stale-while-revalidate" "=" delta-seconds

如果由于存在该扩展指令而以过期形式提供已缓存的响应, 缓存应当在继续提供过期响应的同时尝试重新验证它 (即不阻塞).

注意, “过期”意味着按照 HTTP 的要求, 该响应将具有非零的 Age 头部和 warning 头部.

如果经过了 delta-seconds 之后, 已缓存的实体仍未完成重新验证, 在没有其他信息的情况下, 则不应继续以过期形式提供它.

3.1. 示例 (Example)

包含以下内容的响应:

Cache-Control: max-age=600, stale-while-revalidate=30

表示它在 600 秒内是新鲜的 (fresh), 并且在尝试异步验证时, 最多还可以继续以过期形式额外提供 30 秒. 如果验证没有得出确定结论, 或者没有流量触发它, 则在 30 秒后 stale-while-revalidate 功能将停止工作, 已缓存的响应将变为“真正”过期 (即下一个请求将被阻塞并按正常方式处理).

通常, 服务器会希望将 max-age 与 stale-while-revalidate 的组合设置为它们所能容忍的最长潜在新鲜度生命周期. 例如, 若两者都设为 600, 则服务器必须能够容忍该响应从缓存中提供长达 20 分钟.

由于异步验证只会在响应变为过期之后, 且在 stale-while-revalidate 时间窗结束之前有请求发生时才会进行, 因此该时间窗的大小以及其中发生请求的概率, 决定了所有请求都能无延迟提供的可能性. 如果时间窗太小或流量过于稀疏, 某些请求将落在该时间窗之外, 并被阻塞, 直到服务器能够验证已缓存的响应.