学习浏览器缓存(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]html

浏览器缓存的分类

  1. 强缓存
  2. 协商缓存程序员

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

  • 强缓存
    浏览器在加载资源时,会先根据本地缓存资源的 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。网络

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

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

参考资料

相关文章
相关标签/搜索