http缓存机制
按是否向服务器重新请求划分:强制缓存、对比缓存
强制缓存
响应头字段:
决定缓存是否失效的两个字段:Expires/Cache-Control
expires:http1.0产物,而现在浏览器基本都是http1.1,此字段决定缓存的到期时间,这个时间是由服务器端设定的,因此可能会和客户端时间存在误差,因此推荐使用cache-control
cache-control
– 常见取值:
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存
对比缓存
首次请求返回数据和缓存标识,再次请求带着缓存标识,若没过期返回304,使用缓存数据,若过期返回新的标识以及数据
last-modified/if-modified-since
- 响应头字段:last-modified:资源最后被修改时间
- 请求头字段:if-modified-since:如果资源最后修改时间在大于此时间,则返回新的数据,否则返回304
Etag / If-None-Match(优先级高于前两个):
- 响应头字段:etag:资源的唯一标识
- 请求头字段:if-none-match:使用上次etag返回的值,若与服务器此时的值相等,返回304使用缓存,否则返回新的数据以及标识
两者区别与关系:
- 两类缓存规则的不同,强制缓存如果生效,不需要再和服务器发生交互,而对比缓存不管是否生效,都需要与服务端发生交互。
- 两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。
- 强制缓存的使用主要基于时间设定,对比缓存主要基于资源标识,并交由服务器校验判断