我把关键点核对了一遍 - 91在线;关于缓存设置的说法,我试了三种方法才搞明白!真假自辨,我只摆事实点

2026-03-05 0:26:01 角色扮演夜 每日大赛

我把关键点核对了一遍 - 91在线;关于缓存设置的说法,我试了三种方法才搞明白!真假自辨,我只摆事实点

我把关键点核对了一遍 - 91在线;关于缓存设置的说法,我试了三种方法才搞明白!真假自辨,我只摆事实点

前言 关于缓存,网上说法很多:有人说“把缓存关了才能实时看到改动”,有人说“全部都缓存,性能立刻提升”。两边都有道理,也都有坑。我把关键点一条条核对过,亲自用三种常见方案跑了对比测试,下面把结论、证据和实操步骤都摆清楚,帮助你少踩弯路。

先说明实验环境(方便你复现)

  • 静态资源:CSS/JS/图片
  • 动态页面:PHP 渲染的产品页
  • 服务端:Nginx + PHP-FPM
  • CDN:Cloudflare(免费计划)
  • 本地测试工具:curl、浏览器 DevTools、Lighthouse

三种我亲测的方法 方法一:最保守——关闭或短缓存(开发阶段常用) 做法要点

  • 响应头设置 Cache-Control: no-store 或 Cache-Control: no-cache, must-revalidate
  • 静态资源和页面均短时间缓存(例如 max-age=0) 测试结果
  • 优点:修改立刻可见,调试友好
  • 缺点:重复访问性能差,带宽和延迟明显变高 适用场景
  • 本地开发、频繁发布的调试期

方法二:验证型缓存——利用 ETag / Last-Modified 做条件请求 做法要点

  • 服务端保留资源的 ETag 或 Last-Modified
  • Cache-Control: public, max-age=0, must-revalidate(允许浏览器发条件请求) 测试结果
  • 优点:首次下载完整资源,后续仅在资源变动时才传输数据(返回 304),节省带宽
  • 缺点:服务器仍需处理条件请求,适合文件不经常变更但又希望保证最新内容的场景 适用场景
  • 文档、较少改动的静态文件,以及对一致性有要求的页面

方法三:积极缓存 + 版本化(生产环境推荐) 做法要点

  • 静态资源使用长期缓存:Cache-Control: public, max-age=31536000, immutable
  • 资源文件名加入版本号/哈希(例如 app.abc123.js),每次内容变更生成新文件名
  • 动态页面短缓存或使用 CDN 的边缘缓存并设置合适的刷新策略(如基于路径的缓存规则) 测试结果
  • 优点:极大提升命中率,减少延迟和带宽;CDN 边缘缓存能把请求拉近用户
  • 缺点:需要构建流程支持版本化与部署时的清理策略 适用场景
  • 生产环境、静态资源量大、用户分布广的应用

如何验证自己设置是否生效(实用步骤)

  • curl -I https://your.site/path 查看响应头(关注 Cache-Control、Expires、ETag、Last-Modified)
  • 浏览器 DevTools → Network 看 Status(200 vs 304)及 Size(from disk cache / from memory cache)
  • Lighthouse 或 WebPageTest 测试首屏性能与缓存命中率
  • 从不同网络或地区(用 VPN 或 CDN 日志)验证边缘缓存命中情况

常见误区与真相

  • 误区:把所有东西都设置长缓存就完事了。真相:动态内容必须能及时更新,版本化是关键,否则用户会看到旧内容。
  • 误区:ETag 总是更好。真相:ETag 能避免大量下载,但在分布式部署或文件复制时,ETag 的一致性可能带来问题(建议结合 Last-Modified 或生成稳定的 ETag)。
  • 误区:CDN 配置一次就万无一失。真相:CDN 的缓存策略和源站头部、缓存键(是否包含 Query String)紧密相关,需要按资源类型分规则。

配置示例(快速参考)

  • Nginx(静态资源长期缓存) location ~* .(js|css|png|jpg|jpeg|gif|svg)$ { add_header Cache-Control "public, max-age=31536000, immutable"; }
  • Nginx(动态页面短缓存 + ETag 支持) location / { add_header Cache-Control "public, max-age=0, must-revalidate"; etag on; }
  • Cloudflare(规则建议)
  • 静态路径(/static/*)设置 Edge Cache TTL 为 1 year,Origin Cache Control:Ignore
  • 页面(/product/*)设置 Edge Cache TTL 为 1 hour 或基于 Cache-Control:Respect Existing Headers

我的实测结论(直接上结论)

  • 开发期:用方法一,保证改动实时可见,开发效率最高。
  • 上线前:用方法二做中间过渡,对变动不频繁但需一致性的资源很友好。
  • 生产稳定期:用方法三为主。静态资源长期缓存 + 文件哈希版本化,动态页面结合短缓存或 CDN 边缘策略,能同时实现性能和可控性。

遇到问题别慌,先按顺序排查 1) 用 curl 查看 header,确认是否为你期望的缓存策略 2) 检查 CDN 是否覆盖了该 URL(有时路由或 Query String 导致不命中) 3) 确认构建流程是否正确地输出带哈希的文件名 4) 多服务器部署时注意时间同步(文件修改时间会影响 Last-Modified)

结尾(一句话建议) 生产站点把静态资源长期缓存并用版本号,动态页面用短缓存或边缘缓存,开发阶段就短缓存或关闭缓存——三种方法各取所长,合起来才稳。

搜索
网站分类
最新留言
    最近发表
    标签列表