HTTP缓存机制
一、缓存可以用来干什么?
http缓存机制是web性能优化的重要手段。
二、缓存规则解析
客户端第一次请求数据时,在缓存中没有找到对应的缓存数据;于是向服务器请求数据,服务器返回数据(数据+缓存规则)后,客户端将数据和缓存规则存入缓存中。
缓存规则有多种,根据是否向服务器重新发送请求来分类,将其分为两大类:强制缓存和对比缓存。
1、强制缓存:分两种情况,缓存里有请求的数据(命中) 和 缓存里没有请求的数据(未命中)。命中的时候,直接从缓存中拿数据,不用请求服务器;未命中的时候,需要请求服务器,返回新的数据。
2、对比缓存:和强制缓存一样,也分两种情况,命中和未命中。不一样的是,客户端获取的是缓存数据的标识,而且每次都要向服务器请求验证缓存中对应的数据是否过期,如果未过期(命中),客户端从缓存里拿取数据;如果过期(未命中),则服务器返回新的数据和缓存规则。
强制缓存优先级比对比缓存优先级高。意思就是当强制缓存和对比缓存同时存在且命中时,首先使用强制缓存规则。
三、详细解析强制缓存和对比缓存
1、强制缓存
怎么知道缓存里的数据有没有过期?在强制缓存里,响应头中有两个字段标明失效规则Expires/Cache-Control。
1.1 Expires:中文翻译为期满;文件、协议等失效;断气;逝世。(想到html语义化,让人一眼明了)它里面保存的就是服务器返回的到期时间。但是现在(2018/9/19)基本不使用Expires,这是HTTP1.0的东西,现在使用HTTP1.1的东西Cache-Control。
1.2 Cache-Control:也是见其名知其意,控制缓存(到期时间)。它常见的取值有private,public,max-age=xxx,no-cache,no-store。我们需要知道的是:
max-age=xxx指定缓存内容在xxx秒后失效;
no-cache是说不用强制缓存,使用对比缓存来验证缓存数据。
其他的不用管。(见参考资料[1])
*到期的意思就是:在规定的时间内请求数据,可以从缓存里成功获取,过期就不能从缓存里拿取数据了。
2、对比缓存:
对比缓存肯定是要对比的。对比的是数据的标识。客户端向服务器请求数据时,服务器返回的有数据+缓存标识+缓存规则,客户端再将这些东西保存在缓存里。客户端再次请求时,只需要将标识发送给服务器,让服务器比对,成功的话,服务器返回304状态码,告诉客户端:你可以从缓存里拿请求的数据。
对于对比缓存规则,传递的是缓存标识,怎么理解缓存标识?其实一共分为两种标识传递,Last-Modified/If-Modified-Since和Etag/If-None-Match。
2.1 Last-Modified/If-Modified-Since
2.1.1. Last-Modified:顾名思义,最后修改时间。服务器响应请求,返回浏览器资源的最后修改时间。
2.1.2. If-Modified-Since:这个头会用在再次请求上。返回的是上次请求,服务器返回的资源最后修改时间。再次请求,服务器就会将If-Modified-Since和被请求资源的最后修改时间(Last-Modified)进行比对,如果Last-Modified>If-Modified-Since,说明被请求的资源在上次请求之后有改动,服务器返回200,并把数据返回给客户端;如果Last-Modified<=If-Modified-Since,说明上次请求后,被请求的资源没有被改动过,服务器返回304,告诉客户端,你继续使用缓存中要请求的数据。
2.2. ETag/If-None-Match
2.2.1. ETag:全称是Entity Tag,翻译是实体标签。换言之就是标识(每个标识都是唯一的)。第一次请求时,服务器就返回当前资源的标识。
2.2.2. If-None-Match:翻译是否存在匹配。这个头出现在请求中,服务器就会比较If-None-Match和ETag。不同,说明资源被改变,重新返回被请求的资源和状态码200;相同,说明资源没有被改过,返回304,告诉客户端:你接着使用缓存里的被请求的资源。
参考资料:
[1] https://www.cnblogs.com/chenqf/p/6386163.html