首页 > 编程知识 正文

浏览器的缓存有哪些,浏览器的缓存如何下载

时间:2023-05-05 19:19:12 阅读:43433 作者:1471

浏览器缓存知识1 .缓存过程分析2 .强大的缓存原理2.1 expires 2.2 cache-control 2.3 frommemorycache和fromdisk cache2.4管理强大的缓存3协商密钥

浏览器缓存(客户端缓存)是web页面性能优化中静态资源优化的一大优势,也是无数web开发人员在工作中不可避免的大问题,因此在产品开发中如何避免缓存的出现了解浏览器的缓存命中原理是web APP应用开发的基础。 本文着眼于此,学习浏览器缓存的相关知识,总结缓存规避和缓存管理的方法,并结合具体情况说明缓存的相关问题。 我希望对需要的人有帮助。

1 .缓存进程将浏览器与服务器通信的方式作为响应模式进行分析。 这意味着浏览器启动HTTP请求,服务器响应该请求。 在中,当浏览器首次向服务器提交此请求后收到请求结果时,它将根据响应消息的HTTP标头的缓存id确定是否缓存结果。 将请求结果和缓存id保存到浏览器缓存中。 简单的过程如下图所示。

从上图可以看出

1、浏览器每次开始请求时,首先在浏览器缓存中查找该请求的结果和缓存id。 2、浏览器在每次收到返回请求的结果时,都将结果和缓存id保存在浏览器缓存中。 以上两点结论是浏览器缓存机制的关键。 他确保了各请求的缓存保存和读取。 了解浏览器缓存的使用规则可以解决所有问题。 本文也就这一点进行详细分析。

在此,为了便于理解,根据是否需要向服务器重新发出HTTP请求,将缓存进程分为强制缓存和协商缓存:两部分

1 )浏览器在加载资源时,首先确定是否从该资源的一部分http header命中了强缓存。 如果遇到强缓存,浏览器将直接从其缓存读取资源,而不向服务器发送请求。 例如,对于某个css文件,如果浏览器在加载具有该css的web页时在强缓存中命中该css文件的缓存配置,则浏览器直接从缓存加载该css,甚至将请求发送到具有该web页的服务器2 )如果强缓存未命中,浏览器一定会向服务器发送请求,在服务器端根据资源的其他http header验证此资源是否命中协商缓存。 如果协商缓存命中,服务器将返回此请求,但不返回此资源的数据,而是直接告诉客户机可以从缓存中加载此资源,然后浏览器又从自己的缓存中加载此资源3 )强大的缓存和协商缓存的共同点是,如果命中,资源数据将从客户端缓存加载,而不是从服务器加载;不同的是,强缓存不会向服务器发送请求,协商缓存不会向服务器发送请求4 )如果也没有找到协商缓存,浏览器将直接从服务器加载资源数据。 2 .强制缓存原理强制缓存是在浏览器缓存中查找其请求结果,并基于结果缓存规则确定是否使用该缓存结果的过程。 强制缓存的情况主要有三种,不分析协商缓存过程如下:

(1)此缓存结果和缓存id不存在,强制缓存无效时,与第一次请求一致(直接向服务器发送请求),如下图所示)。

)2)存在此缓存结果和缓存标志,但如果结果已过期,强制缓存已过期,则如下图所示使用协商缓存) )暂不分析)。

)3)如果存在此缓存结果和缓存标志,且此结果尚未过期,则启用强制缓存并返回结果,如下图所示。

那么强制缓存的缓存规则是什么?

当浏览器向服务器发送请求时,服务器会在HTTP响应消息的HTTP标头中包含缓存规则,并随请求结果返回给浏览器。 控制强制缓存的字段分别为Expires和Cache-Control,Cache-Conctrol的优先级高于Expires。

2.1 Expires Expires是HTTP/1.0控制web缓存的字段,其值是服务器返回其请求结果缓存的过期日期。 也就是说,在重新发送请求时,如果客户端时间小于Expires值,则保留缓存结果。

Expires是HTTP/1.0字段,但当前浏览器默认使用HTTP/1.1。 在HTTP/1.1中,web缓存是否由Expires控制?

到了HTTP/1.1,Expires已被Cache-Control取代。 这是因为,Expires控制缓存的原理是,如果客户端和服务端的时间出于某些原因不同,则将客户端的时间与服务端的时间进行比较。 客户端和服务端的一个时间不准确)发生误差时,如果直接禁用强制缓存,强制缓存就没有存在的意义。 在、

2.2在cache-control http/1.1中,cache-control是最重要的规则,主要用于控制web缓存,主要采用以下值:

(1)公共(缓存所有内容)客户端和代理服务器都可以缓存;(2)私有)所有内容只能由客户端缓存,缓存-控制默认设置是否使用缓存需要经过协商验证)4)决定为否-不使用强制缓存,也不使用协商缓存(5) max-age=xxx ) XXXisnumeric ) :缓存内容为XXX 接下来我们来看一个例子。 如下所示。

>由上面的例子我们可以知道:
(1)HTTP响应报文中expires的时间值,是一个绝对值
(2)HTTP响应报文中Cache-Control为max-age=600,是相对值

由于Cache-Control的优先级比expires,那么直接根据Cache-Control的值进行缓存,意思就是说在600秒内再次发起该请求,则会直接使用缓存结果,强制缓存生效。

注:在无法确定客户端的时间是否与服务端的时间同步的情况下,Cache-Control相比于expires是更好的选择,所以同时存在时,只有Cache-Control生效。

2.3 from memory cache 和 fromdisk cache

(1)内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:

1、快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。2、时效性:一旦该进程关闭,则该进程的内存则会清空。
(2)硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。

2.4 强缓存的管理

6)如果缓存问题出现在ajax请求中,最有效的解决办法就是ajax的请求地址追加随机数;
7)还有一种情况就是动态设置iframe的src时,有可能也会因为缓存问题,导致看不到最新的效果,这时候在要设置的src后面添加随机数也能解决问题;
8)如果你用的是grunt和gulp这种前端工具开发,通过它们的插件比如grunt-contrib-connect来启动一个静态服务器,则完全不用担心开发阶段的资源更新问题,因为在这个静态服务器下的所有资源返回的respone header中,cache-control始终被设置为不缓存:

实际应用中我们会碰到需要强缓存的场景和不需要强缓存的场景,通常有2种方式来设置是否启用强缓存:
1)通过代码的方式,在web服务器返回的响应中添加Expires和Cache-Control Header;
2)通过配置web服务器的方式,让web服务器在响应资源的时候统一添加Expires和Cache-Control Header。

3 协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,主要有以下两种情况:

(1)协商缓存生效,返回304,如下

(2)协商缓存失败,返回200和请求结果,如下

同样,协商缓存的标识也是在响应报文的HTTP头中和请求结果一起返回给浏览器的,控制协商缓存的字段分别有:Last-Modified / If-Modified-Since和Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。

3.1 Last-Modified / If-Modified-Since

(1)Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间,如下:

(2)If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过此字段值告诉服务器该资源上次请求返回的最后被修改时间。服务器收到该请求,发现请求头含有If-Modified-Since字段,则会根据If-Modified-Since的字段值与该资源在服务器的最后被修改时间做对比,若服务器的资源最后被修改时间大于If-Modified-Since的字段值,则重新返回资源,状态码为200;否则则返回304,代表资源无更新,可继续使用缓存文件,如下。

3.2 Etag / If-None-Match

(1)Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),如下:

(2)If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,发现该请求头中含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200,如下。

注:Etag / If-None-Match优先级高于Last-Modified / If-Modified-Since,同时存在则只有Etag / If-None-Match生效。

4 总结

强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存,主要过程如下:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。