HTTP的场景实践 | 青训营

123 阅读2分钟

Chrome 浏览器的缓存策略实践

1. 强缓存

强缓存是通过设置响应头来实现的,浏览器在请求资源之前会先检查本地是否有缓存,并根据缓存的情况来决定是否发送请求。

Cache-Control 和 Expires

  • Cache-Control 是一个相对较新且更强大的头部,它提供了更多的缓存控制选项。例如,您可以设置 max-age 指令来定义资源在多长时间内是可缓存的。
  • Expires 是一个老旧的头部,表示资源过期的时间。但它是基于服务器时间的绝对值,可能会因为本地时间不同步而导致问题。
httpCopy code
HTTP/1.1 200 OK
Cache-Control: max-age=3600
Expires: Thu, 26 Aug 2023 10:00:00 GMT

在这个例子中,响应头指示资源可以在本地缓存中保存一个小时,直到 2023 年 8 月 26 日 10:00:00 GMT 过期。

2. 协商缓存

协商缓存是在强缓存失效时使用的备用机制,浏览器会发送一个带有缓存验证信息的请求到服务器,然后服务器根据这些信息来判断是否需要发送资源。

Last-Modified 和 If-Modified-Since

  • Last-Modified 是服务器响应中的头部,指示资源的最后修改时间。
  • If-Modified-Since 是发送到服务器的头部,包含上次获取资源时的修改时间。
httpCopy code
GET /example.jpg HTTP/1.1
If-Modified-Since: Tue, 20 Aug 2023 15:00:00 GMT

如果服务器认为资源自从 If-Modified-Since 之后没有修改,它会返回 304 Not Modified,浏览器则会使用缓存。

ETag 和 If-None-Match

  • ETag 是一个资源的唯一标识符,可以是一个哈希值或其他任何内容的唯一表示。
  • If-None-Match 是发送到服务器的头部,包含前次获取资源时获得的 ETag
httpCopy code
GET /example.jpg HTTP/1.1
If-None-Match: "abc123"

如果服务器的资源仍然有相同的 ETag,它会返回 304 Not Modified,浏览器继续使用缓存。

3. 缓存优先级

浏览器通常会根据一定的策略来决定是否使用强缓存还是协商缓存,以及如何选择合适的缓存版本。例如,浏览器可能会优先考虑强缓存,如果强缓存失效,然后才会使用协商缓存。

结论

Google Chrome 浏览器在 HTTP 请求中使用了强缓存和协商缓存的策略,通过 Cache-ControlExpiresLast-ModifiedIf-Modified-SinceETagIf-None-Match 头部来实现。这些策略帮助浏览器在网络请求中更有效地使用缓存,从而提升性能和用户体验。根据资源的变化频率和重要性,您可以选择合适的缓存策略来优化您的网站或应用程序。