美文网首页
浏览器缓存机制

浏览器缓存机制

作者: 夏知更 | 来源:发表于2018-08-30 20:58 被阅读19次
一、浏览器缓存

在我们讨论浏览器缓存机制之前,我们首先要知道什么是浏览器缓存?

可能对于这个概念我们已经听过很多次,但是对它依然没有概念。但是我们一定遇见过这样的场景,当我们打开一个网页,手动刷新后,发现它加载的时间比第一次打开时快。

这是因为我们第一次打开一个网站的时候,电脑上会自动把这个网站上的一些图片和文件下载到你的电脑,当你第二次要访问这个网站的时候,图片就直接从本地显示出来了,加快打开网站的速度,这就是浏览器缓存。

二、缓存的分类
  • 强缓存(本地缓存)
    用户发送请求后,直接从客户端缓存中获取,不经过服务器。

  • 弱缓存(协商缓存)
    用户发送请求到服务器,由服务器判断是否资源发生了更新,是否从缓存中获取资源。

  • 共同点
    无论是强缓存还是弱缓存,最终都是从客户端缓存中获取了资源。

  • 区别
    强缓存不经过服务器,协商缓存经过服务器。

  • 状态码
    强缓存200,弱缓存304。

当我们在说浏览器缓存的时候,其实是在说这两种情况:


强缓存与弱缓存
三、缓存原理

浏览器第一次请求资源时,必须下载所有的资源,然后根据响应的header内容来决定,如何缓存资源。可能采取强缓存,也可能是弱缓存。

缓存原理流程图:


缓存流程

步骤:
1、先查找内存,如果内存中存在,从内存中加载(强缓存);
2、如果内存中未查找到,选择硬盘获取,如果硬盘中有,从硬盘中加载(强缓存);
3、如果硬盘中未查找到,那就进行网络请求(比对资源是否更新,未更新则命中弱缓存);
4、未命中弱缓存,请求后加载到的资源缓存到硬盘和内存;

四、缓存策略

通过http header来配置缓存策略,但是强缓存和弱缓存配置的字段不同。

强缓存
强缓存是利用Expires和Cache-Control,让服务器为文件设置一个过期时间,如果时间未过期,则在此时间内认为文件是最新的,命中强缓存,使用缓存文件不发送请求到服务器。

  • Expires
    Expires用于设置资源的“失效时刻”,对应的值是一个具体的 GMT(格林尼治时间)。

    Expires
  • Cache-Control
    在HTTP1.0中,Expires 所定义的缓存时间是相对服务器上的时间而言的,因为其定义的是资源“失效时刻”,所以如果浏览器上的时间跟服务器上的时间不一致(特别是用户修改了自己电脑的系统时间),那缓存时间可能就没什么意义了。
    所以为了解决这种无法保证和浏览器时间统一的问题,HTTP 1.1引入了Cache-Control,当Expires和Cache-Control同时存在时,Cache-Control优先级高于Expires。

    到期设置:
    max-age=XX:设置缓存存储的最大周期,超过这个时间被认为过期(单位秒)。

    max-age
    可缓存性:
    publicpublic表明响应可以被任何对象缓存,包括发送请求的客服端,代理服务器等等。
    privateprivate表明只有用户自己的浏览器可以缓存,公共代理服务器不能缓存。
    no-cacheno-cache强制浏览器在使用cache前先提交一个请求到服务器进行确认。http请求没有减少,会减少一个响应体(文件内容),这种个选项类似弱缓存。
    only-if-cacheonly-if-cache表明客户端只接受已经缓存的响应,并且不像服务器检查是否有更新。

    其他设置:
    no-storeno-store告诉浏览器任何情况下都不要进行缓存,不在本地保留可拷贝数据。

  • 命中强缓存
    命中强缓存时,有两种状态,200 (from memory cache) cache & 200 (from disk cache)

具体区别请点这里:from memory cache与from disk cache

弱缓存
如果强缓存没有设置或者时间过期,导致未命中,则进入弱缓存阶段。

  • Last-Modified & if-modified-since:
    Last-Modified:服务器告诉客户端,资源最后一次修改的时间。

    Last-Modified
    If-Modified-Since: 再次请求时,请求头中带有该字段,服务器会将Last-Modified和If-Modified-Since字段进行对比,如果相等,则表示没有修改过资源,返回304,使用缓存;否则,表示修改过资源,返回200和数据。
    一对报文在一个请求中出现
    只有这一对报文判断是否命中协商缓存的缺陷:
    1、If-Modified-Since最小单位是秒,如果资源更新的速度是秒以下,缓存无法使用。
    2、如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间(文件内容并不改变)但是依旧起不到缓存的作用。
  • ETag
    Etag存储的是文件的特殊标识(一般是hash生成的)。
    Etag和If-no-match是一对报文。
    ETag是首次请求的时候,服务器返回的。
    If-None-Match也是浏览器发送到服务器验证文件是否改变的。
    如果请求报文的ETag与服务器的不一致,则表示该资源已经被修改过来,需要发最新的内容给浏览器。

    Etag和If-no-match
  • Etag/lastModified过程如下:
    1、客户端第一次向服务器发起请求,服务器将附加Last-Modified/ETag到所提供的资源上去;
    2、当再一次请求资源,如果没有命中强缓存,在执行在验证时,将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器;
    3、服务器检查该Last-Modified或ETag,并判断出该资源页面自上次客户端请求之后还未被修改,返回响应304和一个空的响应体。

    使用时,需要同事使用这两个报文头,只有当两个都匹配的时候,才会命中弱缓存,否则需要重新请求资源。

相关文章

  • 【转载】彻底理解浏览器的Http缓存机制

    转自:彻底理解浏览器的缓存机制(http缓存机制) 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是...

  • 浏览器缓存机制

    浏览器缓存机制:浏览器缓存机制,其实主要就是http协议定义的缓存机制(如:Expires;Cache-contr...

  • 让我们学习了解浏览器的缓存,提高页面的流畅度

    浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制...

  • Web浏览器的缓存机制

    原文转载【Web缓存机制系列】2 – Web浏览器的缓存机制 浏览器端的缓存规则 对于浏览器端的缓存来讲,这些规则...

  • 2020-08-14 彻底理解浏览器的Http缓存机制

    彻底理解浏览器的Http缓存机制 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的...

  • http的缓存机制(个人笔记)

    本文来源:彻底理解浏览器的Http缓存机制 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HT...

  • nginx 缓存(11)

    介绍nginx是如何设置缓存之前,我们还是先聊聊web浏览器的缓存机制。 1.浏览器缓存 浏览器的缓存机制也就是我...

  • http 缓存机制

    概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓...

  • 浏览器缓存(http缓存)

    浏览器缓存有两种:强制缓存和协商缓存 浏览器缓存机制 浏览器发送请求,会先从浏览器缓存中查找【请求结果】和【缓存标...

  • 浏览器缓存

    浏览器的缓存机制 浏览器的缓存机制实际上就是HTTP缓存机制,其实就是根据请求报文中的缓存标识符进行识别然后进一步...

网友评论

      本文标题:浏览器缓存机制

      本文链接:https://www.haomeiwen.com/subject/ucxlwftx.html