stale-while-revalidate和Cache-Control头中的s-maxage如何交互?

8

我只是想了解一下我为我的SSR页面指定的头部:public,s-maxage = 3600,stale-while-revalidate = 59

请注意,我的stale-while-revalidate值为59秒,远小于s-maxage值为1小时。 我想知道当stale-while-revalidate值小于s-maxage时,会发生什么情况? stale-while-revalidate头部会被忽略吗?

1个回答

8
将页面的Cache-Control头设置为s-maxage=3600, stale-while-revalidate=59意味着两件事:
  1. 该页面在3600秒内被视为新鲜的(s-maxage=3600);
  2. 在此之后,从缓存提供给用户的页面可以使用最多59秒(stale-while-revalidate=59),同时服务器会在后台进行重新验证操作。
stale-while-revalidate并不会被忽略,它确定了页面的maxage过期后,在重新验证操作发生的额外时间窗口。
以下是在三个时间窗口内的缓存状态(根据https://web.dev/stale-while-revalidate/#live-example):
0到3600秒 3601到3660秒 3660秒后
缓存的页面是新的且用于提供页面服务。无需重新验证。 缓存的页面是陈旧的,但仍用于提供页面服务。重新验证将在后台进行以填充缓存。 缓存的页面是陈旧的且不再使用。需要新请求以提供页面服务并填充缓存。

摘自HTTP缓存控制扩展用于陈旧内容规范:

通常,服务器会希望将max-agestale-while-revalidate的组合设置为它们能够容忍的最长总潜在新鲜度寿命。例如,如果将两者都设置为600,则服务器必须能够容忍从缓存中提供响应长达20分钟。

由于异步验证只会在响应变得陈旧,但在stale-while-revalidate窗口结束之前发生请求时才会发生,因此该窗口的大小和其中发生请求的可能性决定了所有请求无延迟提供响应的可能性有多大。如果该窗口太小或者流量过低,则一些请求将落在该窗口之外并阻塞,直到服务器可以验证缓存的响应。


一旦“过期-验证”触发并获取了一个“新鲜”的页面,这个过程会重新开始吗?也就是说,“新”页面现在有3600秒可以从缓存中提供服务,然后才会生成一个“新”页面? - james emanon
@jamesemanon 是的,没错。新页面会被缓存3600秒。 - juliomalves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接