浏览器缓存总结

浏览器缓存是前端开发中不可避免的问题,对于web应用来讲,它是提高页面性能同时减小服务器压力的利器。本文将简单地描述总结下浏览器缓存的知识和应用,但愿对本身和你们都有所帮助前端

浏览器缓存类型web

有两种,强缓存和协商缓存算法

1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项中能够看到该请求返回200的状态码,而且size显示from disk cache或from memory cache;chrome

2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,若是命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;浏览器

3.二者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求缓存

缓存有关的header服务器

强缓存负载均衡

Expires:response header里的过时时间,浏览器再次加载资源时,若是在这个过时时间内,则命中强缓存。性能

Cache-Control:当值设为max-age=300时,则表明在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。资源

Expires和Cache-Control:max-age=*** 的做用是差很少的,区别就在于 Expires 是http1.0的产物,Cache-Control是http1.1的产物,二者同时存在的话,Cache-Control优先级高于Expires;在某些不支持HTTP1.1的环境下,Expires就会发挥用处。因此Expires实际上是过期的产物,现阶段它的存在只是一种兼容性的写法
协商缓存

ETag和If-None-Match:这两个要一块儿说。Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种惟一标识,只要资源有变化,Etag就会从新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值作比较,若是相同,则表示资源文件没有发生改变,命中协商缓存。

Last-Modified和If-Modified-Since:这两个也要一块儿说。Last-Modified是该资源文件最后一次更改时间,服务器会在response header里返回,同时浏览器会将这个值保存起来,在下一次发送请求时,放到request header里的If-Modified-Since里,服务器在接收到后也会作比对,若是相同则命中协商缓存。


ETag和Last-Modified的做用和用法也是差很少,说一说他们的区别。

首先在精确度上,Etag要优于Last-Modified。Last-Modified的时间单位是秒,若是某个文件在1秒内改变了屡次,那么他们的Last-Modified其实并无体现出来修改,可是Etag每次都会改变确保了精度;若是是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。

第二在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只须要记录时间,而Etag须要服务器经过算法来计算出一个hash值。

第三在优先级上,服务器校验优先考虑Etag。

浏览器缓存过程

浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header及该请求的返回时间一并缓存;

下一次加载资源时,先比较当前时间和上一次返回200时的时间差,若是没有超过cache-control设置的max-age,则没有过时,命中强缓存,不发请求直接从本地缓存读取该文件(若是浏览器不支持HTTP1.1,则用expires判断是否过时);若是时间过时,则向服务器发送header带有If-None-Match和If-Modified-Since 的请求;

服务器收到请求后,优先根据Etag的值判断被请求的文件有没有作修改,Etag值一致则没有修改,命中协商缓存,返回304;若是不一致则有改动,直接返回新的资源文件带上新的Etag值并返回 200;

若是服务器收到的请求没有Etag值,则将If-Modified-Since和被请求文件的最后修改时间作比对,一致则命中协商缓存,返回304;不一致则返回新的last-modified和文件并返回 200;

用户行为对浏览器缓存的控制

地址栏访问,连接跳转是正经常使用户行为,将会触发浏览器缓存机制;

F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断;

ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源。

相关文章
相关标签/搜索