强缓存和协商缓存–终结篇
- 2020 年 3 月 18 日
- 筆記
浏览器缓存是指浏览器在本地磁盘对用户最近请求过的资源进行存储。通过缓存,可以减少浏览器与服务器的通信次数,提升网站的性能。浏览器缓存分为强缓存和协商缓存。
强缓存
介绍
浏览器在请求资源文件时,首先会判断是否命中强缓存。根据该资源缓存的header信息,依据expires和cache-control字段判断是否命中强缓存,若命中则直接从缓存中获取资源,返回状态码200,不再继续向服务器发起请求。
相关状态码
200
相关字段
Expries
该字段是http1.0时的规范,其值为一个绝对时间的GMT格式的时间字符串,如Wen, 18 Mar 2020 17:25:00 GMT,如果发送请求的时间在该值之前,则判断其命中强缓存。
Cache-Control
http1.1时的规范,该字段有五个相关属性可设置:
max-age:其值为一个数字,表示多少秒,代表缓存的最大相对时间。如设置Cache-Control:max-age=500
,则从资源最后一次从服务器获取的时间开始计算,500秒之后过期。
pubilc:浏览器和代理服务器都可以对资源进行缓存。
privite:只有浏览器可以缓存,代理服务器不能缓存。
no-cache:无法使用强缓存,可以使用协商缓存。
no-store:所有缓存都无法使用。
协商缓存
介绍
浏览器若没用命中强缓存,则会继续判断是否命中协商缓存。若命中协商缓存,则返回状态码304,代表资源已存在,直接从缓存中取资源,不再向浏览器发起请求;否则,则会重新向浏览器请求资源。
相关状态码
304
相关字段
Etag/If-None-Match
Etag是一个资源唯一标识符,当资源发生改变该标识符就会变化,它是一个hash编码值。当浏览器第一次访问某个资源时,返回的资源会带有一个Etag标识符,浏览器再次访问该资源时,请求头中会带有一个If-None-Match的字段,它的值就是上次返回的Etag的值。然后将If-None-Match与新的Etag进行校验看是否一致,若一致,若一致,则继续判断last-modefied是否一致;若不一致,则重新请求服务器资源。
Last-Modified/If-Modified-Since
Last-Modified是一个的GMT格式的时间字符串,表示资源最后修改时间。当浏览器第一次访问某个资源时,返回的资源会带有一个Last-Modified标识符,浏览器再次访问该资源时,请求头中会带有一个If-Modified-Since的字段,它的值就是上次返回的Last-Modified的值。然后将If-Modified-Since与新的Last-Modified进行校验看是否一致,则命中协商缓存。
Etag和Last-Modified区别
- Etag要优于Last-Modified。Last-Modified的时间单位最小是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度。
- 在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。
- 在优先级上,服务器校验优先考虑Etag。