浏览器的强制缓存和协商缓存【详解和流程】

在浏览器中,缓存分为强制缓存和协商缓存两种策略。

强制缓存

强制缓存是指在缓存期内,浏览器直接从缓存中获取资源,而不会向服务器发送请求。强制缓存可以通过设置响应头中的Cache-Control和Expires字段来实现。

  • Cache-Control
    Cache-Control是HTTP/1.1中定义的缓存控制字段,常见的取值如下:
    public:响应可以被任意缓存(包括客户端和代理服务器)缓存。
    private:响应只能被客户端缓存,不能被代理服务器缓存。
    max-age:指定缓存的有效期,单位为秒。
    no-cache:表示需要协商缓存,浏览器每次都需要向服务器发送请求,确认资源是否有更新。
    no-store:禁止缓存,每次都需要向服务器发送请求获取最新资源。
  • Expires
    Expires是HTTP/1.0中定义的缓存控制字段,它表示资源的过期时间,是一个GMT格式的日期字符串。当浏览器发送请求时,会比较当前时间和Expires字段的值,如果当前时间在过期时间之前,就直接从缓存中获取资源。

协商缓存

协商缓存是指在缓存期内,浏览器向服务器发送请求,通过比较资源的最后修改时间或唯一标识符等信息,判断是否需要更新缓存。协商缓存可以通过设置响应头中的Last-Modified和ETag字段来实现。

  • Last-Modified
    Last-Modified表示资源的最后修改时间,当浏览器发送请求时,会在请求头中添加If-Modified-Since字段,告诉服务器当前缓存的资源的最后修改时间。服务器收到请求后,会将当前资源的最后修改时间与请求头中的If-Modified-Since字段进行比较,如果相同,就返回304 Not Modified状态码,表示资源未更新,浏览器可以继续使用缓存。

  • ETag
    ETag是资源的唯一标识符,可以是任意字符串。当浏览器发送请求时,会在请求头中添加If-None-Match字段,告诉服务器当前缓存的资源的唯一标识符。服务器收到请求后,会将当前资源的唯一标识符与请求头中的If-None-Match字段进行比较,如果相同,就返回304 Not Modified状态码,表示资源未更新,浏览器可以继续使用缓存。

缓存优先级

浏览器发送一个请求如果从缓存策略的观点来看,可以用以下流程表示。

总结

缓存是提高Web性能的重要手段之一,可以有效减少网络请求,加快页面加载速度。在浏览器中,缓存分为强制缓存和协商缓存两种策略。强制缓存通过设置响应头中的Cache-Control和Expires字段来实现,协商缓存通过设置响应头中的Last-Modified和ETag字段来实现。强制缓存优先级高于协商缓存,但在强制缓存过期之后,浏览器会先判断是否存在协商缓存的字段,如果存在,则会发送一个带有If-Modified-Since或If-None-Match字段的请求给服务器,否则直接向服务器发送请求获取最新资源。在设置缓存策略时,需要注意强制缓存和协商缓存的有效期和更新时间,避免因缓存失效而影响用户体验。

你可能感兴趣的:(缓存,前端)