04.存储篇 1:浏览器缓存机制介绍与缓存策略剖析

 内容出自前端性能优化原理与实践,我作为笔记简单记录下。

浏览器缓存机制有四个方面,

    Memory Cache

    Service Worker Cache

    HTTP Cache

    Push Cache

HTTP 缓存机制探秘

    HTTP 缓存分为强缓存和协商缓存。优先级较高的是强缓存,在命中强缓存失败的情况下,才会走协商缓存。

强缓存的特征

    强缓存是利用 http 头中的 Expires 和 Cache-Control 两个字段来控制的。浏览器会根据其中的 expires 和 cache-control 判断目标资源是否“命中”强缓存,若命中则直接从缓存中获取资源,不会再与服务端发生通信。

命中强缓存的情况下,返回的 HTTP 状态码为 200 (如下图)。

强缓存的实现:从 expires 到 cache-control

实现强缓存,过去我们一直用 expires 。

当服务器返回响应时,在 Response Headers 中将过期时间写入 expires 字段。像这样:

expires: Wed, 11 Sep 2019 16:12:18 GMT

    expires 是一个时间戳,试图再次向服务器请求资源,浏览器就会先对比本地时间和 expires 的时间戳,如果本地时间小于 expires 设定的过期时间,那么就直接去缓存中取这个资源。

    expires 是有问题的,它最大的问题在于对“本地时间”的依赖。如果服务端和客户端的时间设置可能不同,或者我直接手动去把客户端的时间改掉,那么 expires 将无法达到我们的预期。

    考虑到 expires 的局限性,HTTP1.1 新增了 Cache-Control 字段来完成 expires 的任务。

    给 Cache-Control 字段一个特写:

cache-control: max-age=31536000

     max-age 是 31536000 秒,它意味着该资源在 31536000 秒以内都是有效的

    Cache-Control 相对于 expires 更加准确,它的优先级也更高

协商缓存:浏览器与服务器合作之下的缓存策略

    协商缓存依赖于服务端与浏览器之间的通信。

    协商缓存机制下,浏览器需要向服务器去询问缓存的相关信息,进而判断是重新发起请求、下载完整的响应,还是从本地获取缓存的资源。

    如果服务端提示缓存资源未改动(Not Modified),资源会被重定向到浏览器缓存,这种情况下网络请求对应的状态码是 304(如下图)。

    协商缓存的实现:从 Last-Modified 到 Etag

    Last-Modified 是一个时间戳,如果我们启用了协商缓存,它会在首次请求时随着 Response Headers 返回:

    Last-Modified: Fri, 27 Oct 2017 06:35:57 GMT

    使用 Last-Modified 存在一些弊端,这其中最常见的就是这样两个场景:

    1.我们编辑了文件,但文件的内容没有改变。

    2.当我们修改文件的速度过快时(比如花了 100ms 完成了改动),由于 If-Modified-Since 只能检查到以秒为最小计量单位的时间差,所以它是感知不到这个改动的

    这两个场景其实指向了同一个 bug——服务器并没有正确感知文件的变化。为了解决这样的问题,Etag 作为 Last-Modified 的补充出现了。

    Etag 是由服务器为每个资源生成的唯一的标识字符串,这个标识字符串是基于文件内容编码的

    Etag 在感知文件变化上比 Last-Modified 更加准确,优先级也更高。当 Etag 和 Last-Modified 同时存在时,以 Etag 为准。

MemoryCache

    MemoryCache,是指存在内存中的缓存。它是浏览器最先尝试去命中的一种缓存。

其他缓存自行百度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 浏览器对于请求资源, 流程如图所示: 可以看到浏览器的缓存机制分为两个部分: 1、当前缓存是否过期? 2、服务器中...
    zhoulujun阅读 4,965评论 0 3
  • 0 前言 在前端开发中,性能一直都是被大家所重视的一点,然而判断一个网站的性能最直观的就是看网页打开的速度。其中提...
    七寸知架构阅读 12,920评论 7 58
  • 一、前言 缓存可以说是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,...
    沉落的星星阅读 3,008评论 0 0
  • 一、前言 缓存可以说是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,...
    浪里行舟阅读 208,018评论 46 521
  • 图文.三月潋影.原创 从小我就特别羡慕那些家里有亲哥哥的同学。有哥哥是一种什么感觉呢?...
    三月潋影阅读 5,356评论 42 34

友情链接更多精彩内容