强缓存、协商缓存是什么?

253 阅读3分钟

1. 强缓存(Strong Caching)

强缓存允许浏览器直接从本地缓存中读取资源,而不向服务器发送请求。强缓存通过 HTTP 头中的 Cache-Control 和 Expires 字段来控制。

  1. Cache-Control:这是 HTTP/1.1 引入的头字段,支持多种指令,例如:
  • max-age:指定资源被缓存的最长时间(以秒为单位)。
  • public:指示响应可以被任何缓存存储,包括 CDN 缓存。
  • private:指示响应只能被浏览器缓存。
  • no-cache:强制浏览器每次都向服务器发送请求进行验证。
  • no-store:禁止缓存,所有请求和响应都不会被缓存。
  1. Expires:这是 HTTP/1.0 使用的头字段,用于指定资源的过期时间点。这个时间点是一个具体的日期和时间。例如:Expires: Tue, 19 Jan 2021 20:00:00 GMT 。如果 Cache-Control 头字段也存在,Expires 将被忽略。
Cache-Control: max-age=3600
Expires: Tue, 19 Jan 2021 20:00:00 GMT

在资源的有效期内(max-age 或 Expires 指定的时间内),浏览器会直接从本地缓存中读取资源,而不再向服务器发送请求。

(快速的本地缓存机制,在有效期内可以直接使用,无需与服务器交互)

2. 协商缓存(Negotiated Caching)

协商缓存是在缓存过期或者缓存策略要求验证时,浏览器向服务器发送请求,服务器根据请求头中的某些字段决定资源是否发生了变化。如果资源没有变化,服务器返回 304 Not Modified 状态码,并且浏览器继续使用本地缓存的资源。

协商缓存使用以下 HTTP 头字段:

  1. Last-Modified / If-Modified-Since:
  • Last-Modified:服务器在响应中返回资源的最后修改时间。
  • If-Modified-Since:浏览器在请求中包含上次获取资源时服务器返回的 Last-Modified 时间,服务器根据此时间判断资源是否发生了变化。
  1. ETag / If-None-Match:
  • ETag:服务器在响应中返回资源的一个唯一表示(实体标签)。
  • If-None-Match:浏览器在请求中包含上次获取资源时服务器返回的 ETag 值,服务器根据此值判断资源是否发生了变化。
Last-Modified: Tue, 19 Jan 2021 20:00:00 GMT
If-None-Match: "686897696a7c876b7e"

如果资源没有变化,服务器返回 304 状态码,并且不返回资源主体内容;如果资源发生变化,服务器返回 200 状态码,并返回新的资源内容。

(更可靠的验证机制,当强缓存失效时,通过与服务器协商来判断资源是否需要更新)

3. 总结

  • 强缓存:资源在指定时间内无需向服务器发送请求,直接从缓存读取。
  • 协商缓存:资源可能需要向服务器发送请求,服务器决定资源是否需要更新。

image.png