You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Public、max-age与s-maxage的Cache-Control语法差异及最优方案咨询

Cache-Control语法差异与Vercel+GitHub API缓存方案推荐

一、两种Cache-Control语法的核心差异

1. public, max-age=<VALUE>

  • public:声明响应可被所有缓存层(浏览器私有缓存、Vercel边缘缓存等中间缓存)存储,由于你的请求不带认证头,默认响应就是public,该关键字可省略。
  • max-age=<VALUE>:统一设置所有缓存层的新鲜期,客户端和中间缓存都会在<VALUE>秒内直接复用缓存,不发起新请求。

2. max-age=<VALUE>, s-maxage=<VALUE>

  • max-age=<VALUE>:仅控制客户端私有缓存(如浏览器)的新鲜期,客户端在这段时间内直接使用本地缓存,不会向Vercel发起请求。
  • s-maxage=<VALUE>:专门覆盖中间缓存(如Vercel边缘缓存)的新鲜期,中间缓存会忽略max-age,仅遵循s-maxage设定的时间。
  • 关于stale-if-error的争议:s-maxage本身不会禁止stale-if-error生效,二者是独立指令。Symfony文档的说法仅针对部分缓存实现——若未显式配置stale-if-error,部分中间缓存可能不会自动复用过期响应,但只要同时声明stale-if-error,就会正常触发错误场景下的过期缓存复用逻辑。

二、适合Vercel+GitHub API的缓存方案

你的核心目标是降低Vercel函数调用量(减少Vercel负载)和GitHub API请求量(规避速率限制),结合Vercel边缘缓存特性,推荐配置:

max-age=14400, s-maxage=7200, stale-while-revalidate=86400

配置逻辑:

  • max-age=14400(4小时):客户端浏览器4小时内直接复用本地缓存,大幅减少Vercel的入口请求量。
  • s-maxage=7200(2小时):Vercel边缘缓存每2小时主动刷新一次缓存(触发你的无服务器函数调用GitHub API),平衡数据新鲜度与GitHub API请求频率。
  • stale-while-revalidate=86400(1天):缓存过期后,Vercel先返回旧缓存给用户,后台异步刷新缓存。既保证用户体验无延迟,又能平滑分散GitHub API请求,避免突发流量触发速率限制。

额外优化建议:

  • 若用户信息更新频率极低,可适当延长s-maxage至4小时,进一步减少GitHub API请求;若更新频繁,可将s-maxage缩短至1小时左右。

内容的提问来源于stack exchange,提问作者rickstaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:50:33