先把这一关过了:如果你只改一个设置:优先改缓存管理

一句话结论:如果你只能改一项设置,就把静态资源的缓存策略(Cache-Control / CDN TTL)做好,并配合版本号(cache-busting)。这个单点优化能带来最明显的加载速度、带宽成本和用户体验提升。
为什么先改缓存管理
- 提升速度:浏览器或 CDN 命中缓存后,静态资源(JS/CSS/图片/字体)无需每次重新下载,首屏与交互延迟会大幅下降。
- 降低成本:减少到源站的请求次数,节省带宽与后端计算资源。
- 提高稳定性:流量高峰时缓存能保护后端,避免服务宕机或响应变慢。
- SEO 与转化:页面加载快直接影响搜索排名与用户留存/转化率。
先改哪一项:实战优先级
- 静态资源设置长缓存 + 版本号
- 对于不可变资源(指名和版本号确定的文件),设置 Cache-Control: public, max-age=31536000, immutable。这样文件只要 URL 不变,浏览器会长期缓存。
- 对于可能变动的资源(如 HTML),设置短缓存或 no-cache,并配合 ETag/Last-Modified 或者使用 stale-while-revalidate 策略。
- 版本号做法:在文件名或查询字符串里加版本号(如 app.v1.2.3.js 或 app.js?v=1.2.3),每次发布变更时改版本号,强制客户端拉取最新文件。
- CDN TTL 与缓存规则
- 将静态资源交给 CDN,设置与源一致的长 TTL,并确保 CDN 缓存键(包括是否考虑 query string、cookie)配置正确。
- 配置按需清理(purge)或使用版本号以避免频繁手动清理。
- HTML 与 API 的缓存策略
- HTML 通常不能设置过长缓存,因为内容频繁变化。用短 TTL(例如 30s–300s)或 no-cache,再结合服务端渲染时的片段缓存(fragment caching)。
- 对于返回 JSON 的 API,根据数据特性分层缓存:静态或冷数据长缓存;用户专属或实时性强数据短缓存或不缓存。
- 服务器与应用层缓存
- 数据库查询结果、模板渲染、会话数据等用 Redis / Memcached 缓存,合理设置 TTL 和失效策略。
- 启用语言/平台的字节码缓存(PHP 的 OPcache、Python 的模块缓存)以减少计算开销。
如何实际操作(简单可执行的步骤)
- 第一步(迅速见效):把所有静态资源(.js .css .png .jpg .svg .woff2)配置为 Cache-Control: public, max-age=31536000, immutable,并用文件名或 query string 加版本号。
- 第二步:在 CDN 控制台把这些路径设置为长 TTL,确认 CDN 是否把 query string 或 cookie 作为缓存键。
- 第三步:HTML 资源设置短缓存或 no-cache,启用 ETag/Last-Modified,必要时加 stale-while-revalidate。
- 第四步:监测缓存命中率(CDN/反向代理/Redis 提供的指标),观察带宽与响应时间变化。
- 第五步:建立发布流程,每次上线自动更新资源版本号并触发 CDN 或者依赖版本化避免强制清理。
常见坑与规避方法
- 把 HTML 也设置为一年缓存:会让用户长期看到旧内容。解决:HTML 用短缓存或 no-cache。
- 忘记版本化:更新静态文件却不换 URL,客户端继续用旧缓存。解决:自动化构建里嵌入哈希或版本号。
- CDN 缓存键被 cookie 或会话污染:会导致缓存命中率为 0。解决:在 CDN/反向代理中排除不必要的 header/cookie。
- 盲目设置所有资源长缓存:动态或个性化内容必须区分,对不同路径采用不同策略。
检测与验证工具
- Chrome DevTools Network 面板(查看 Cache-Control、Age、x-cache 等响应头)
- curl -I https://your.site/asset.js(快速检查响应头)
- Lighthouse / WebPageTest(看到缓存策略对性能的影响)
- CDN 与 Redis 的控制台(查看命中率、缓存大小和 purge 操作日志)
一句可执行的承诺(如果你只做一件事) 把静态资源改成长期缓存(Cache-Control: public, max-age=31536000, immutable),并把资源 URL 做版本化。其余缓存策略再逐步细化,但先过这一关,你会立马看到速度、成本和稳定性的回报。
需要我把你的站点响应头做一次扫描,列出哪些文件可以立刻设置为长期缓存、哪些需要短缓存以及如何版本化吗?只要给我几个样例 URL 就行。