浏览器“快递柜”:强缓存与协商缓存的妙用

15 阅读3分钟

想象一下你每天都要接收快递——有些包裹每天内容都一样(比如日报),而有些包裹内容会更新(比如生鲜)。浏览器缓存就像你家门口的智能快递柜,用两种不同的策略帮你高效管理这些“网络包裹”。

快递柜的两套系统

强缓存像是快递柜的“自动签收”模式。快递员看到柜子里的旧报纸还在,就知道今天不用再送同样的报纸了。对应到浏览器,就是检查本地缓存是否“在保质期内”。浏览器通过两个HTTP头部实现这个机制:

  • Cache-Control: max-age=3600(最多存放1小时)

  • Expires: Thu, 01 Jan 2025 00:00:00 GMT(明确过期时间)

当浏览器再次请求相同资源时,如果发现缓存未过期,就直接从本地读取,完全不需要联系服务器——状态码显示为灰色(from disk cache或from memory cache),网络请求耗时几乎为零。

当包裹可能更新时

协商缓存则像需要“确认签收”的模式。快递员会查看旧包裹的标签(比如最后修改日期),打电话给发货方确认:“您今天送来的和昨天的一样吗?”如果一样,就不需要重新派送。

浏览器通过两组头部对话实现协商缓存:

  1. 最后修改时间对话

    • 浏览器问:“这个文件自Last-Modified: Wed, 01 Sep 2021 08:00:00 GMT后改过吗?”

    • 服务器答:“没改过,用缓存吧”(304 Not Modified)

  2. 唯一标识对话(更精确)

    • 浏览器问:“我手里的ETag: "a1b2c3d4"还是最新版本吗?”

    • 服务器对比当前文件ETag,匹配则返回304,否则发送新文件(200 OK)

智能组合策略

实际应用中,两者通常配合使用,形成高效的两级检查:

第一次请求 → 服务器返回资源 + 缓存策略
↓
再次请求 → 先检查强缓存是否过期
    ├─ 未过期 → 直接使用本地缓存(极速)
    └─ 已过期 → 发起协商缓存请求
        ├─ 内容未变 → 304,更新缓存时间
        └─ 内容已变 → 200+新资源

为什么需要两种缓存?

强缓存速度极快,但“保质期”设置需要谨慎:设置过长,用户可能看不到更新;设置过短,又失去了缓存意义。

协商缓存每次都要与服务器“确认”,虽然多了网络请求,但能确保获取最新内容,同时避免重复下载未改变的资源——这对经常小更新的文件特别友好。

实际应用中的智慧

开发人员根据资源类型选择合适的策略:

  • 永不改变的资源(如版本化文件名:main.a1b2c3.js):强缓存,设置很长过期时间

  • 可能改变的资源(如用户头像):强缓存+协商缓存组合

  • 始终最新的数据(如股票行情):不缓存或极短缓存

理解这两种缓存机制,不仅有助于提升网站性能,还能减少服务器压力。现代Web应用通过合理的缓存策略,能让用户几乎瞬间打开页面,同时确保他们看到的内容始终保持更新——这背后,正是强缓存与协商缓存默契配合的智慧。