缓存优化
- ISR缓存如何配合CDN缓存
- ISR缓存和CDN缓存一般设置多长时间
- s-maxage缓存时间设置多久
- s-maxage、stale-while-revalidate配置
- CDN缓存
- 降低回源压力、提升 TTFB
ISR缓存配合CDN缓存
- ISR 管“页面多久重新生成一次”,CDN 缓存管“这份页面多久直接从边缘返回”。
'/': {
isr: 1800, // 缓存半个小时
headers: {
'Cache-Control': 'public, max-age=60, s-maxage=1800, stale-while-revalidate=1800'
}
},
注意配置:
- 浏览器短缓存,CDN 长缓存。
max-age=60是给浏览器看的s-maxage=1800是给CDN / 共享缓存看的
响应头Cache-Control配置
s-maxage理解
s-maxage表示共享缓存“多久- s可以理解为 share 共享
- s-maxage用于CDN缓存, 因为CDN就是共享层,很多用户共享同一份 CDN 缓存
- 对于同一个节点、同一个URL,这些用户都是用的同一份缓存
stale-while-revalidate理解
- 当缓存过期后,允许先返回旧内容,同时后台去源站拉新内容刷新缓存。
缓存响应头相关
- Age
- max-age
- s-maxage
- stale-while-revalidate
| 响应头 / 指令 | 作用对象 | 含义 | 常见用法 | 易错点 |
|---|---|---|---|---|
Cache-Control: max-age=秒数 | 浏览器 + 共享缓存 | 指定新鲜期,在这段时间内可直接使用缓存 | max-age=60、max-age=600 | 不是只给浏览器用;如果没有 s-maxage,CDN 也可能按它走 |
Cache-Control: s-maxage=秒数 | 共享缓存(CDN / 代理) | 指定共享缓存的新鲜期,优先级高于 max-age | max-age=60, s-maxage=300 | 浏览器不看它 |
Age: 秒数 | 共享缓存返回时附带 | 表示当前缓存对象已经缓存了多久 | Age: 197 | 不是缓存策略时间;它是状态值,不是配置项 |
Cache-Control: public | 浏览器 + 共享缓存 | 明确允许共享缓存存储该响应 | 公共页面、公共 API、静态资源 | 不是“强制缓存”,只是“允许被共享缓存” |
Cache-Control: private | 浏览器 | 允许浏览器缓存,但不允许共享缓存缓存 | 用户中心、订单页 | 不是“不缓存” |
Cache-Control: no-cache | 浏览器 + 共享缓存 | 可以存,但每次使用前必须去源站验证 | HTML、个性化但想协商缓存的接口 | 最容易误解;它不是“不缓存” |
Cache-Control: no-store | 所有缓存 | 完全不允许缓存和存储 | 支付页、敏感信息 | 这个才是真正意义上的“不缓存” |
Cache-Control: must-revalidate | 浏览器 + 共享缓存 | 过期后必须重新验证,不能随便继续用旧副本 | 强一致性要求较高的内容 | 常与 max-age 一起用,而不是单独使用 |
Cache-Control: stale-while-revalidate=秒数 | 主要是共享缓存,也可能浏览器支持 | 过期后一段时间内可先返回旧内容,同时后台刷新 | CDN 缓存 HTML、ISR 场景 | 不是所有环境都完全一致支持 |
Cache-Control: stale-if-error=秒数 | 主要是共享缓存 | 当源站报错时,允许继续返回旧缓存一段时间 | 提升可用性 | 只在错误场景兜底,不是正常更新策略 |
ETag | 浏览器 + 共享缓存协商 | 资源版本标识,用于协商缓存 | ETag: "abc123" | 它本身不决定缓存多久,只决定如何验证是否变化 |
Last-Modified | 浏览器 + 共享缓存协商 | 资源最后修改时间,用于协商缓存 | Last-Modified: Thu, 26 Mar 2026 07:00:00 GMT | 精度通常不如 ETag |
Expires | 浏览器 + 共享缓存 | 指定绝对过期时间 | 老系统兼容 | 现代场景优先看 Cache-Control |
如何理解“浏览器短缓存,CDN 长缓存
浏览器短缓存
- 表示浏览器 60 秒内可直接用本地缓存。
- 浏览器过了 1 分钟后,会重新请求;这个请求通常先到 CDN,再由 CDN 决定是否回源,如果CDN缓存过期了,则回源站到服务器获取新的资源,如果没过期,则直接获取CDN缓存
max-age=60
浏览器短缓存为什么短?
因为浏览器缓存是“单用户本地缓存”,有几个特点:
- 一旦缓存住,用户刷新都可能还拿旧内容
- 难以统一控制
- HTML 页面变化时,用户本地容易滞后
- 用户手动强刷前可能一直看旧页面
所以浏览器缓存 HTML 一般不配太长。
CDN长缓存
- 表示 CDN 边缘节点可缓存 30 分钟。
s-maxage=1800
为什么 CDN 可以更长?
因为 CDN 是可控的共享层:
- 命中率高,能显著减少回源
- 可统一失效、刷新、清理
- 配合
stale-while-revalidate可以平滑更新 - 即便缓存久一点,也比用户本地缓存更可运维
浏览器缓存
- 提高js/css的缓存, 提升页面加载速度
- 设置强缓存
Cache-Control: public, max-age=31536000, immutable