一文搞懂强缓存和协商缓存

242 阅读3分钟

强缓存协商缓存是浏览器缓存机制中的两种方式,用于提升网页加载性能和减少服务器压力。它们通过在客户端缓存资源,避免重复请求,提高资源加载效率。

强缓存(强制缓存)

强缓存指的是浏览器可以直接使用缓存的资源,而无需向服务器发送请求验证资源的有效性。当资源的缓存未过期时,浏览器会直接从本地缓存读取资源。

实现方式

  • HTTP Header 中的 Expires 或 Cache-Control

Expires

  • 指定资源的过期时间,是一个绝对时间点。
  • 例如:Expires: Wed, 21 Oct 2023 07:28:00 GMT

Cache-Control

  • 常用的属性有 max-age,以秒为单位指定资源的有效期。
  • 例如:Cache-Control: max-age=31536000 表示资源在 31536000 秒内(1 年)有效。

特点

  • 在有效期内,浏览器不会发送请求给服务器,直接使用缓存资源。
  • 可以减少请求次数,提升加载速度。

协商缓存

协商缓存是在缓存过期后,浏览器发送请求到服务器,由服务器根据请求头中的特定字段判断资源是否更新。如果资源未更新,服务器返回 304 Not Modified,浏览器继续使用本地缓存。

实现方式

  • HTTP Header 中的 Last-Modified / If-Modified-Since 和 ETag / If-None-Match

Last-Modified / If-Modified-Since

  • Last-Modified:服务器在响应中返回资源的最后修改时间。
  • If-Modified-Since:浏览器在请求中携带上次的 Last-Modified 值,服务器根据此值判断资源是否更新。

ETag / If-None-Match

  • ETag:服务器为资源生成的唯一标识(一般是哈希值)。
  • If-None-Match:浏览器在请求中携带上次的 ETag 值,服务器根据此值判断资源是否更新。

特点

  • 如果资源未修改,服务器返回 304,浏览器使用缓存。
  • 如果资源已修改,服务器返回 200 和新的资源内容。

强缓存与协商缓存的区别

  • 触发条件

    • 强缓存:在缓存未过期时直接使用。
    • 协商缓存:在强缓存失效后,浏览器向服务器验证资源是否更新。
  • 是否与服务器交互

    • 强缓存:不与服务器交互。
    • 协商缓存:需要与服务器交互,由服务器决定是否使用缓存。
  • 优先级

    • 浏览器会先检查强缓存,强缓存失效后再进行协商缓存。

使用顺序

  1. 浏览器首先查看资源是否命中强缓存,如果命中则直接使用缓存,不发送请求。
  2. 如果强缓存未命中,浏览器会发送请求到服务器,进入协商缓存流程。
  3. 服务器根据请求头判断资源是否更新,返回 304 或新的资源。
  4. 浏览器根据服务器响应,决定使用缓存或更新缓存。

示例

设置强缓存和协商缓存的响应头

HTTP/1.1 200 OK
Cache-Control: max-age=3600
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
ETag: "5d8c72a5edda6"

总结

  • 强缓存协商缓存都是为了利用浏览器缓存提高网页性能。
  • 强缓存不与服务器交互,直接使用缓存。
  • 协商缓存需要与服务器交互,确认资源是否更新。
  • 合理配置缓存策略可以显著提升网站的加载速度和用户体验。