大宇宇宇
发布于 2025-09-22 / 12 阅读
0
0

强缓存和协商缓存

什么是浏览器的强缓存和协商缓存?

① 强缓存

        强缓存是指浏览器无需与服务器进行通信,而是直接根据本地缓存是否过期来判断缓存资源是否可用的。强缓存的整体工作流程如下:

  • 首次请求:浏览器向服务器发起资源请求,服务器返回资源,并在响应头设置对应的缓存策略。

  • 缓存资源:浏览器根据响应头中的缓存策略,将资源缓存至本地,并记录有效期。

  • 再次请求:浏览器判断缓存资源是否过期,若资源未过期,则直接从本地缓存获取资源,不与服务器进行通信;如果资源已过期,且配置了协商缓存,则走协商缓存流程,如果未配置协商缓存,则直接向服务器重新请求资源,更新缓存,并根据响应头中的Cache-Control字段,更新当前缓存的缓存策略。

        强缓存的缓存策略主要由 HTTP 响应头中的两个字段控制:Cache-Control(HTTP/1.1) 和 Expires(HTTP/1.0),其中 Cache-Control 更强大,优先级更高。

优点:

        无需与服务端进行通信,加载速度快,适合静态资源

缺点:

        如果资源频繁更新,而过期时间又管理不当,则可能导致用户不能及时访问到新资源。

② 协商缓存

        协商缓存是指当强缓存过期或设置 Cache-Control: no-cache 后,浏览器必须与服务器通信,通过特定标识判断缓存资源是否更新。若服务器判断资源未更新,则此次请求继续使用本地缓存;若资源已更新,则返回新资源和新标识。协商缓存的整体工作流程如下:

  • 首次请求:浏览器向服务器发起资源请求,服务器返回资源,并在响应头设置缓存策略和资源标识。

  • 缓存资源和标识:浏览器根据响应头中的缓存策略,将资源缓存至本地,并记录有效期;同时会将资源标识缓存至本地。

  • 再次请求:浏览器判断缓存资源是否过期,若强缓存未过期,则直接从本地缓存获取资源,不与服务器进行通信;如果资源已过期或设置 Cache-Control: no-cache,则走协商缓存流程,浏览器会在请求头中带上本地缓存的资源标识,服务器会根据标识判断资源是否有更新。如果资源未更新,则返回 304 Not Modified,浏览器继续使用本地缓存,并根据本次响应头中的Cache-Control字段,更新当前缓存的缓存策略;如果资源有更新,则返回 200 OK,并返回新资源和新资源标识,更新缓存,并根据响应头中的Cache-Control字段,更新当前缓存的缓存策略。

        协商缓存的整体机制依赖服务器返回的特定资源标识,浏览器在后续请求时会携带该标识供服务器验证。HTTP请求设置特定标识主要有两组字段:Last-Modified/If-Modified-Since(基于修改时间)和 ETag/If-None-Match(基于资源内容)。如果两组字段同时使用,则 ETag/If-None-Match 的优先级更高。

优点:

        减少与服务端通信的数据传输量,适合动态资源。

缺点:

        每次请求需要进行一次与服务端的通信,判断资源是否更新。

2、HTTP 响应头中 Cache-Control 常用的缓存字段有哪些?

① max-age

        用于指定缓存资源的有效期,单位秒,该时间是从请求成功资源被缓存时开始计算的。例如:max-age=3600,则表示缓存资源在一小时内有效。

② a-maxage

        用于指定缓存资源的有效期,单位秒,但是该指令只对共享缓存有效(CDN/代理服务器等),对客户端浏览器无效,优先级高于max-age。

③ public

        用于指定资源可以被所有缓存所存储,包括但不限于:浏览器缓存、CDN缓存、代理服务器缓存等。

④ private

        用于指定资源只能被客户端浏览器缓存,不允许被其他缓存所存储。

⑤ no-cache

        用于指定资源不使用强缓存,使用协商缓存,资源被缓存之后,每次请求都需与服务器进行通信验证,并非是不缓存。

⑥ no-store

        用于指定资源完全不使用缓存,每次请求都必须从服务器获取。

⑦ immutable

        用于指定资源在有效期内是完全不会变的,有效期内无需向服务器重新请求验证,但强制刷新(ctrl+F5)会绕过该指令。

⑧ must-revalidate

        用于指定不允许使用过期缓存资源,一但缓存过期,再请求时,必须向服务器请求验证。


评论