一、web缓存可以分为数据库缓存、代理服务器缓存、浏览器缓存。
其中浏览器缓存又包含很多内容:http缓存、indexDb、cookie、localStorage等。本片只讨论http缓存相关内容。
二、http缓存是通过头信息控制缓存。
a. 分为强缓存和协商缓存两种。
b. 强缓存如果命中,则不需要和服务器发生交互。
c. 协商缓存不管是否命中,都要和服务器发生交互。
d. 强缓存的优先级高于协商缓存。
三、强缓存。
a. 可以理解为无需验证的缓存策略。
b. 响应头中有两个字段来表明规则Expires/Cache-Control。
c. Expires指定资源过期时间,超过这个时间点表明资源过期。是http1.0的标准。
d. Cache-Control是http1.1的标准,优先级高于Expires。可能的取值有:max-age, s-maxage, public, private, no-cache, no-store, mast-revalidate。
e. max-age指定资源过期时间,单位是s。在指定时间内直接使用缓存,不发送请求。
d. s-maxage作用同max-age,但仅限于共享缓存,在私有缓存中被忽略。
e. public表示响应既可以被代理服务器缓存又能被客户端缓存。
f. private表示响应只能被客户端缓存。
g. no-cache强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器的请求到服务器。
h. no-store禁止缓存,每次请求都要向服务器重新获取。
i. mast-revalidate表示如果缓存资源已过期则请求服务器重新拉取。
四、协商缓存。
a. 缓存的资源到期了,不代表资源的内容发生了改变,如果和服务器上的资源没有差异,实际上没有必要再次请求。
b. 浏览器第一次请求数据后会将数据和响应头部的缓存标识存储起来,再次请求时会带上存储的头部字段,服务器端验证是否可用。返回304代表资源没有发生改变可以使用缓存的数据,获得新的过期时间。返回200就相当于重新请求了一遍资源并替换旧资源。
c. Last-modified / If-Modified-Since: Last-modified服务器端资源的最后修改时间,响应头部会带上这个标识。第一次请求后浏览器记录这个时间,再次请求时,请求头部带上
If-Modified-Since即之前记录下的时间。服务器端收到带If-Modified-Since的请求后回去和资源的最后修改时间对比。相等返回304,否则返回最新资,源状态码200。
d. Etag / If-None-Match:原理同Last-modified / If-Modified-Since,只不过Etag是服务器端生成的一段hash字符串,精确度比laste-modified要高,属于强验证,要求资源字节级别的一致。