前端进阶-网络传输10

5.50 http 缓存策略

参考答案

  • http 缓存策略

    浏览器每次发起请求时,先在本地缓存中查找结果以及缓存标识,根据缓存标识来判断是否使用本地缓存。如果缓存有效,则使用本地缓存;否则,则向服务器发起请求并携带缓存标识。根据是否需向服务器发起HTTP请求,将缓存过程划分为两个部分:
    强制缓存和协商缓存,强缓优先于协商缓存。

    • 强缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。
    • 协商缓存,让客户端与服务器之间能实现缓存文件是否更新的验证、提升缓存的复用率,将缓存信息中的Etag和Last-Modified
      通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。

    HTTP缓存都是从第二次请求开始的:

    • 第一次请求资源时,服务器返回资源,并在response header中回传资源的缓存策略;

    • 第二次请求时,浏览器判断这些请求参数,击中强缓存就直接200,否则就把请求参数加到request header头中传给服务器,看是否击中协商缓存,击中则返回304,否则服务器会返回新的资源。这是缓存运作的一个整体流程图:

  • 强缓存

    • 强缓存命中则直接读取浏览器本地的资源,在network中显示的是from memory或者from disk
    • 控制强制缓存的字段有:Cache-Control(http1.1)和Expires(http1.0)
    • Cache-control是一个相对时间,用以表达自上次请求正确的资源之后的多少秒的时间段内缓存有效。
    • Expires是一个绝对时间。用以表达在这个时间点之前发起请求可以直接从浏览器中读取数据,而无需发起请求
    • Cache-Control的优先级比Expires的优先级高。前者的出现是为了解决Expires在浏览器时间被手动更改导致缓存判断错误的问题。
      如果同时存在则使用Cache-control。
  • 强缓存-expires

    • 该字段是服务器响应消息头字段,告诉浏览器在过期时间之前可以直接从浏览器缓存中存取数据。
    • Expires 是 HTTP 1.0 的字段,表示缓存到期时间,是一个绝对的时间 (当前时间+缓存时间)。在响应消息头中,设置这个字段之后,就可以告诉浏览器,在未过期之前不需要再次请求。
    • 由于是绝对时间,用户可能会将客户端本地的时间进行修改,而导致浏览器判断缓存失效,重新请求该资源。此外,即使不考虑修改,时差或者误差等因素也可能造成客户端与服务端的时间不一致,致使缓存失效。
    • 优势特点
      • HTTP 1.0 产物,可以在HTTP 1.0和1.1中使用,简单易用。
      • 以时刻标识失效时间。
    • 劣势问题
      • 时间是由服务器发送的(UTC),如果服务器时间和客户端时间存在不一致,可能会出现问题。
      • 存在版本问题,到期之前的修改客户端是不可知的。
  • 强缓存-cache-control

    • 已知Expires的缺点之后,在HTTP/1.1中,增加了一个字段Cache-control,该字段表示资源缓存的最大有效时间,在该时间内,客户端不需要向服务器发送请求。
    • 这两者的区别就是前者是绝对时间,而后者是相对时间。下面列举一些 Cache-control 字段常用的值:(完整的列表可以查看MDN)
      • max-age:即最大有效时间。
      • must-revalidate:如果超过了 max-age 的时间,浏览器必须向服务器发送请求,验证资源是否还有效。
      • no-cache:不使用强缓存,需要与服务器验证缓存是否新鲜。
      • no-store: 真正意义上的“不要缓存”。所有内容都不走缓存,包括强制和对比。
      • public:所有的内容都可以被缓存 (包括客户端和代理服务器, 如 CDN)
      • private:所有的内容只有客户端才可以缓存,代理服务器不能缓存。默认值。
    • Cache-control 的优先级高于 Expires,为了兼容 HTTP/1.0 和 HTTP/1.1,实际项目中两个字段都可以设置。
    • 该字段可以在请求头或者响应头设置,可组合使用多种指令:
      • 可缓存性
        • public:浏览器和缓存服务器都可以缓存页面信息
        • private:default,代理服务器不可缓存,只能被单个用户缓存
        • no-cache:浏览器器和服务器都不应该缓存页面信息,但仍可缓存,只是在缓存前需要向服务器确认资源是否被更改。可配合private,
          过期时间设置为过去时间。
        • only-if-cache:客户端只接受已缓存的响应
      • 到期
        • max-age=:缓存存储的最大周期,超过这个周期被认为过期。
        • s-maxage=:设置共享缓存,比如can。会覆盖max-age和expires。
        • max-stale[=]:客户端愿意接收一个已经过期的资源
        • min-fresh=:

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

前端岗位面试真题宝典 文章被收录于专栏

本面试宝典均来自校招面试题目大数据进行的整理

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务