浏览器的缓存机制

1:缓存范例

 1:强缓存
 2:协商缓存

1: 强缓存:不会向效劳器发要求,直接从浏览器的缓存内里读取。状况码为200,size为from disk cache 或许 from memory cache

2: 协商缓存:会向效劳器发送要求,效劳器会依据request header内里的参数推断是不是掷中缓存,假如掷中就会返回304,而且带上新的response header返回关照浏览器从缓存文件内里读取数据。

2: 与强缓存相干的request header

1: Expires
2: Cache-Control

先来看一下各自的用法:

1: Expires: Wed, 21 Oct 2015 07:28:00 GMT
2: Cache-Control: 'max-age=60'

Expires设置的是一个在效劳器端的相对时刻,意义是在这个相对之间之前的要求,浏览器都直接从浏览器当地的缓存内里读取资本,不发要求。
Cache-Control: ‘max-age=60’ 内里的60,单元是秒,以上设置的意义是指以后的60秒以内的要求都从浏览器当地缓存内里读取,不发要求。
Expires是http1.0的,而Cache-Control是http1.1的,当两者都有的时刻,是Cache-Control见效。只需在不支持http1.1的情况下,Expires才见效。
Expires属于response header, 然则,Cache-Control即能够出现在request header内里,也能够出现在response header内里,它的值也另有许多,下一篇再细讲。

3: 协商缓存
跟协商缓存相干的header主要有四个,个中request header 2个,response header 2个。
1: request header

1: If-None-Match
2: If-Modified-Since

2: response header

1: Etag
2: Last-Modified

1: 先解释一下2个response header是什么:
Etag
Etag是资本的唯一标识,只需资本发生变化,Etag就是从新天生。Etag会在上一次资本加载时,经由过程reponse header返回,浏览器会把这个Etag保留起来。
Last-Modified
Last-Modified是资本末了一次被修正的时刻,也是经由过程response header返回,浏览器也会把这个时刻保留起来。
2: 再来看看这2个response header怎样用
浏览器在要求的时刻,会把Etag的值赋给If-None-Match;把Last-Modified的值给If-Modified-Since,也就是:

If-None-Match: ${Etag}
If-Modified-Since: ${Last-Modified}

效劳器处置惩罚这条要求,拿到此次的Etag和Last-Modified的值与效劳器上的资本的Etag和Last-Modified比较,假如雷同,那就掷中协商缓存。

这两队的作用是一样的,然则都有各自的优缺点:
1: 准确度
Etag > Last-Modified
由于Last-Modified的精读是秒,假如一个文件在一秒以内改变了许屡次,那Last-Modified不会变。然则Etag是只需资本发生变化,Etag就会更新,那缓存的掷中率就会高一些,也能够说是更准确。
2: 机能
Last-Modified > Etag
由于Last-Modified只须要保留一个时刻值就好,而Etag须要效劳器用算法算一个hash值。
3: 优先级
Etag> Last-Modified

PS: 虽然在上面的内容内里,在cache-control出现在强缓存那节,协商缓存也没有提到cache-control,然则cache-control的某些情况下也会触发协商缓存,这个内容鄙人一篇文章再讲。

    原文作者:nanaistaken
    原文地址: https://segmentfault.com/a/1190000012907313
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞