浏览器中的缓存机制你了解多少?

176 阅读5分钟

从输入UPL到看到页面经历了URL 解析,缓存检查,DNS解析,TCP三次握手,http数据通信,TCP四次挥手,渲染页面。 第二步缓存检查都有哪些?

基于页面性能优化法则:

@对于静态文件,设置强缓存和协商缓存,【目的保证页面再次访问的时候速度加快,因为是直接从缓存中获取信息,减少对服务器的请求。。。】

第一次访问页面,都需要检查本地是否有对资源的缓存【缓存HTML/CSS/JS/图片--->静态资源文件&数据/.....】

  • 运行内存(虚拟内存->内存条)Memory Cache

  • 物理内存(硬盘)Disk Cache

一般情况下,从服务器获取的资源会在  运行内存和物理内存  中都缓存一份,但是当页面关闭,运行内存中缓存的信息聚会被销毁

有缓存则使用缓存:

  • 刷新页面(F5),先从Memory Cache 查找,如果没有再从Disk Cache查找

  • 关闭页面重新打开,直接从Disk Cache 查找

  • ctrl+F5强制清除缓存,会把本地缓存的新奇都移除掉,接下来从服务器重新获取数据!!

资源文件缓存查找的总步骤:先看“强缓存”是否生效(生效:有缓存信息且没有过期)如果生效,则使用强缓存的内容;如果不生效,在去检查“协商缓存”是否生效,生效则使用协商缓存信息。如果还是不生效,则直接从服务器重新获取!

“强缓存”

当客户端向服务器发送请求,首先会检查本地强缓存信息是否生效,如果生效则从缓存中获取即可,如果不生效则重新向服务器发送请求,服务器在返回想要的内容的同时,"在响应头中携带两个字段:Expirse(http1.0)或者Cache-Control(http1.1)来记录当前缓存的有效时间",客户端浏览器获取到返回的内容和对应的字段后,除了渲染页面,同时还会把本次获取的信息存在本地。

  • 强缓存是由服务器设置规则,客户端浏览器按照规则去执行,如果服务器返回内容的同时并没有设置Expirse/Cache-Control,则客户端浏览器不会缓存任何的信息。。。
  • 即使从本地缓存中获取信息渲染,状态码返回的也是200(服务器获取的状态码也是200),从运行内存中获取不需要时间,但是从物理内存中获取是需要时间的,但是也比服务器获取快多了1
  • 副作用:如果客户端缓存了之前获取的信息资源信息,但是服务器端已经把这个资源更新了,这样客户端渲染的还是之前的内容,无法拿到最新的内容渲染!!
  • 解决强缓存副作用的办法:
  1. HTML页面绝对不能设置强缓存,因为它是一个页面渲染的入口(css/js/图片都是在渲染HTML的过程中再次发送请求)如果它做了强缓存,则彻底和服务器“失联了”!
  2. 如何保证其他资源的更新呢?  如果有其他资源有更新,我们在HTML中导入的时候,可以设置时间戳  或者  更新后的文件和之前的文件名保持不同即可(基于webpack完成)】

                     

“协商缓存”

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程

  • 第一次请求资源,直接向服务器发送请求,服务器返回“资源信息”&‘Last-Modified’:存储资源最后更新的时间(http1.0)ETag:服务器资源更新都会生成一个全新的唯一标识值,ETag存储的就是(http1.1)。浏览器接受信息后,渲染页面的同时,把资源信息及相关的字段信息缓存到本地。【ETag:服务器最后更新生成的唯一标识;Last-Modified  服务器最后更新时间,最小单位是秒(可能会出现一个问题:例如:一秒内文建更新两次,但是最后显示的更新时间是相同的,存在秒内误差!)】
  • 第二次或者n次请求资源,首先不是看本地有没有缓存,而且直接向服务器发送请求(基于请求头If-Modified-Since:Last-Modified值  If-None-Match:ETag值  把之前存储的字段值传递给服务器),服务器接受到信息后,和当前资源最新更新的时间及标识做对比,验证资源是否更新过;如果没有更新过,只返回304 即可(客户端获取的是304 ,直接从本地缓存中获取信息渲染即可),如果有更新过,返回200状态码以及最新的文件信息,再以及最新的:Last-Modified/ETag(客户端按照最新的资源渲染,同时也把最新的信息缓存在本地)
两种缓存的区别

“协商缓存”可以保证获取服务器最新的资源,(但是也需要向服务器发送请求,只不过每一次都从服务器获取信息快一点而已;而强缓存,如果我们解决了其副作用,它是不需要向服务器发送请求的!)

所以真实项目中:HTML资源不做强缓存,只做协商缓存,但是其余资源  强缓存和协商缓存都做(在强缓存失效后,还可以走协商缓存)