浏览器缓存

258 阅读4分钟
  1. 缓存过程

    浏览器每次发起请求时,先在浏览器缓存中查找该请求的结果和缓存标志,根据查找结果决定是否向服务器发送请求。浏览器获取请求结果后,根据响应报文中 HTTP 头的缓存标识决定是否缓存请求结果。

  2. 缓存类型

    有两种,强制缓存和协商缓存。

  3. 什么是强制缓存?

    强制缓存就是在浏览器缓存中查找请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。

    强制缓存的情况主要有三种:

    1. 请求的缓存结果和缓存标识不存在,强制缓存失效,直接向服务器发送请求;
    2. 请求的缓存结果和缓存标识存在,但结果已失效,强制缓存失效,使用协商缓存;
    3. 请求的缓存结果和缓存标志存在,且结果尚未失效,强制缓存生效,直接返回缓存结果。
  4. 强制缓存的缓存规则是什么?

    控制强制请求的请求头是ExpiresCache-ControlCache-Control优先级比Expires高。

    • HTTP 1.0使用Expires控制网页缓存,它的值为服务器返回的请求结果缓存的到期时间,再次发送请求时,如果客户端的时间小于Expires的值,就直接使用缓存结果。使用Expires存在客户端与服务器时间可能有误差的问题。

    • HTTP 1.1使用Cache-Control代替了ExpiresCache-Control可以取以下值

      Cache-Control值 含义
      no-store 禁止对请求和响应内容进行缓存
      no-cache 强制确认缓存,每次都将请求发送给服务器,由服务器验证请求中所描述的缓存是否过期,未过期就返回 304
      private 响应内容只有客户端可以缓存,代理服务器不可以缓存,Cache-Control的默认值
      public 相应内容可以被任何中间人(代理、CDN 等)缓存
      max-age 缓存内容将在设定的多少秒后失效

    ExpiresCache-Control同时存在时,只有Cache-Control生效。

  5. 浏览器中如何判断强制缓存是否生效?

    打开控制台,选择Network,在Size列查看,如果显示灰色的from memory cache或者from disk cache表示使用了强缓存。

    • from memory cache表示使用内存中的缓存。内存缓存具有快速读取和时效性两个特点。
      • 快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次快速读取。
      • 时效性:一旦该进程关闭,则该进程的内存会清空。
    • from disk cache表示硬盘缓存。硬盘缓存将缓存写入硬盘文件中,读取缓存时需要对该缓存存放的硬盘文件进行 I/O 操作,然后重新解析缓存内容,读取复杂,速度比内存缓存慢。
  6. 什么是协商缓存?

    协商缓存是指强制缓存失效后,浏览器携带缓存标识向服务器发起请求,服务器根据缓存标识决定是否使用缓存的过程。

    协商缓存主要有以下两种情况:

    1. 协商缓存生效,返回 304;

    2. 协商缓存失效,返回 200 和请求结果。

  7. 协商缓存的规则是什么?

    控制协商缓存的响应头有Last-ModifiedEtag,请求头有If-Modified-SinceIf-None-MatchEtag/If-None-Match这对头部比Last-Modified/If-Modified-Since优先级高。

    头部 含义
    Last-Modified(响应头) 返回的资源文件在服务器最后被修改的时间
    If-Modified-Since(请求头) 客户端再次发起请求时,携带上次请求返回的Last-Modified
    Etag(响应头) 返回的资源文件的唯一标识(由服务器生成)
    If-None-Match(请求头) 客户端再次发起请求时,携带上次请求返回的Etag值
    • 服务器读取到请求头中的If-Modified-Since后,用该值与该资源在服务器的最后修改时间做对比,如果客户端资源不是最新的,则重新返回资源,状态码为 200;否则返回状态码 304,表示资源没有更新。
    • 服务器读取到请求头中的If-None-Match字段后,用该值与该资源在服务器的最新Etag进行对比,一致就返回 304,表示资源没有更新;否则重新返回资源文件,状态码为200。

详解:

  1. 详细的请求过程:

https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/4/19/162db635ed5f6d26~tplv-t2oaga2asx-image.image


参考:

  1. 【掘金】页面性能优化办法有哪些?juejin.cn/post/684490…
  2. 【掘金】彻底理解浏览器的缓存机制:juejin.cn/post/684490…
  3. 【MDN】HTTP缓存:developer.mozilla.org/zh-CN/docs/…