zoukankan      html  css  js  c++  java
  • 学习浏览器缓存(http缓存)

    Q: 浏览器缓存是个什么东东,为什么要学习浏览器缓存涅?

    A: 浏览器缓存其实就是浏览器保存通过HTTP获取的所有资源,是浏览器将网络资源存储在本地的一种行为。浏览器缓存可以减少冗余数据的传输,减小服务器的负担,提高网站性能,页面利用缓存快速的响应。

    任何事物都是有两面性滴,用的好,可以提升用户体验,用不好,还会降低用户体验。

    缓存是什么时候用到的呢,这要从浏览器发起请求说起了,
    !(浏览器缓存)[https://user-gold-cdn.xitu.io/2019/1/21/1686e2735297a596?imageView2/0/w/1280/h/960/format/webp/ignore-error/1]

    浏览器缓存的分类

    1. 强缓存
    2. 协商缓存

    浏览器再向服务器请求资源时,首先判断是否命中强缓存,再判断是否命中协商缓存!

    • 强缓存
      浏览器在加载资源时,会先根据本地缓存资源的 header 中的信息判断是否命中强缓存,如果命中则直接使用缓存中的资源不会再向服务器发送请求。

    这里的 header 中的信息指的是 expires 和 cahe-control.

    • Expires
      该字段是 http1.0 时的规范,它的值为一个绝对时间的 GMT 格式的时间字符串,比如 Expires:Mon,18 Oct 2066 23:59:59 GMT。这个时间代表着这个资源的失效时间,在此时间之前,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。
    • Cache-Control
      Cache-Control 是 http1.1 时出现的 header 信息,主要是利用该字段的 max-age 值来进行判断,它是一个相对时间,例如 Cache-Control:max-age=3600,代表着资源的有效期是 3600 秒。cache-control 除了该字段外,还有下面几个比较常用的设置值:
      no-cache:需要进行协商缓存,发送请求到服务器确认是否使用缓存。
      no-store:禁止使用缓存,每一次都要重新请求数据。
      public:可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。
      private:只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。

    Cache-Control 与 Expires 可以在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高。

    • 协商缓存
      当强缓存没有命中的时候,浏览器会发送一个请求到服务器,服务器根据 header 中的部分信息来判断是否命中缓存。如果命中,则返回 304 ,告诉浏览器资源未更新,可使用本地的缓存。
      这里的 header 中的信息指的是 Last-Modify/If-Modify-Since 和 ETag/If-None-Match.
      Last-Modify/If-Modify-Since
      浏览器第一次请求一个资源的时候,服务器返回的 header 中会加上 Last-Modify,Last-modify 是一个时间标识该资源的最后修改时间。
      当浏览器再次请求该资源时,request 的请求头中会包含 If-Modify-Since,该值为缓存之前返回的 Last-Modify。服务器收到 If-Modify-Since 后,根据资源的最后修改时间判断是否命中缓存。
      如果命中缓存,则返回 304,并且不会返回资源内容,并且不会返回 Last-Modify。
      缺点:
      短时间内资源发生了改变,Last-Modified 并不会发生变化。
      周期性变化。如果这个资源在一个周期内修改回原来的样子了,我们认为是可以使用缓存的,但是 Last-Modified 可不这样认为,因此便有了 ETag。
      ETag/If-None-Match
      与 Last-Modify/If-Modify-Since 不同的是,Etag/If-None-Match 返回的是一个校验码。ETag 可以保证每一个资源是唯一的,资源变化都会导致 ETag 变化。服务器根据浏览器上送的 If-None-Match 值来判断是否命中缓存。
      与 Last-Modified 不一样的是,当服务器返回 304 Not Modified 的响应时,由于 ETag 重新生成过,response header 中还会把这个 ETag 返回,即使这个 ETag 跟之前的没有变化。

    Last-Modified 与 ETag 是可以一起使用的,服务器会优先验证 ETag,一致的情况下,才会继续比对 Last-Modified,最后才决定是否返回 304。

    总结
    当浏览器再次访问一个已经访问过的资源时,它会这样做:

    1. 看看是否命中强缓存,如果命中,就直接使用缓存了。
    2. 如果没有命中强缓存,就发请求到服务器检查是否命中协商缓存。
    3. 如果命中协商缓存,服务器会返回 304 告诉浏览器使用本地缓存。
    4. 否则,返回最新的资源

    参考资料

  • 相关阅读:
    LeetCode 40. 组合总和 II(Combination Sum II)
    LeetCode 129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
    LeetCode 60. 第k个排列(Permutation Sequence)
    LeetCode 47. 全排列 II(Permutations II)
    LeetCode 46. 全排列(Permutations)
    LeetCode 93. 复原IP地址(Restore IP Addresses)
    LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
    LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
    一重指针和二重指针
    指针的意义
  • 原文地址:https://www.cnblogs.com/renbo/p/10336150.html
Copyright © 2011-2022 走看看