1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项中能够看到该请求返回200的状态码,而且size显示from disk cache或from memory cache;算法
2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,若是命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;chrome
注意:二者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求。浏览器
Expires:response header里的过时时间,浏览器再次加载资源时,若是在这个过时时间内,则命中强缓存。
Cache-Control:当值设为max-age=300时,则表明在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。缓存
以百度为案例:
服务器
注意:Expires和Cache-Control的区别还有一个:Expires是一个具体的服务器时间,这就致使一个问题,若是客户端时间和服务器时间相差较大,缓存命中与否就不是开发者所指望的。Cache-Control是一个时间段,控制就比较容易。负载均衡
ETag和If-None-Match:这两个要一块儿说。Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种惟一标识,只要资源有变化,Etag就会从新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值作比较,若是相同,则表示资源文件没有发生改变,命中协商缓存。性能
ETag和Last-Modified的做用和用法也是差很少,说一说他们的区别。
首先在精确度上,Etag要优于Last-Modified。Last-Modified的时间单位是秒,若是某个文件在1秒内改变了屡次,那么他们的Last-Modified其实并无体现出来修改,可是Etag每次都会改变确保了精度;若是是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。
第二在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只须要记录时间,而Etag须要服务器经过算法来计算出一个hash值。
第三在优先级上,服务器校验优先考虑Etag。cdn
一样以京东为案例blog