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
相关产品推荐
相关产品推荐

