缓存

缓存分类:

  1. 强制缓存:强制缓存若生效,就不需要再和服务器发生交互;


    缓存_第1张图片
    强制缓存

    (1)响应头部:Cache-Control/Expires;
    (2)优先级递减顺序:

  • Cache-Control:
    • public:客户端可以缓存;
    • private:客户端和代理服务器都可以缓存(默认值)
    • max-age=xx;缓存内容在xx秒后失效,失效后进行协商缓存;
    • no-cache:需要使用协商缓存验证缓存数据;
    • no-store:所有内容都不缓存,强制缓存和协商缓存都不会触发;
  • Expires:日期;指定实际的过期日期,绝对过期日期;
  1. 协商缓存:会与服务器端进行交互;


    缓存_第2张图片
    协商缓存

    (1) Etag+If-None-Match规则

  • etag(服务器响应首部字段):服务器资源的唯一标识符,其优先级比last-modified高;

  • if-none-match(请求首部字段):再次请求服务器时,通过此字段通知服务器客户端缓存数据的唯一标识,服务器收到请求后发现有字段if-none-match,则与被请求资源的唯一标识进行对比;

    • 不同,说明资源文件被改动过,则响应新的资源内容,返回状态码200;
    • 相同,说明资源无修改,则响应304的header,告知浏览器继续使用保存的cache;

    注:强制缓存的优先级高于协商缓存,即当执行强制缓存的规则时,若缓存生效,直接使用缓存,不再执行对比缓存规则;

(2) Last-Modified+If-Modified-Since规则

  • last-modified(响应首部字段):服务器在响应请求时告诉浏览器资源的最后修改时间;
  • if-modified-since(请求首部字段):再次请求服务器时,通过此字段将响应中last-modified字段值发送给服务器,服务器收到请求后发现有该字段,则与被请求资源的最后修改时间进行对比;
    • 若资源的最后修改大于If-modified-since,说明字段被改动过,则响应整个资源内容,返回状态码200;
    • 若资源的最后修改时间小于或等于If-modified-since,说明资源无新修改,则响应304的header,告知浏览器继续使用所保存的cache;
  1. 各缓存头部优先级情况:
  • 强制缓存优先级>对比缓存优先级,即强制缓存在生效期则对比缓存不生效;
    • Cache-Control优先级>Expires优先级;
    • Etag优先级>Last-Modified优先级;
  1. 不同刷新的请求执行过程
    (1)浏览器地址栏写入URL,回车:web缓存发现有这个文件了,不用继续请求,直接去缓存拿—最快,流量最小;
  • 请求的URI在web缓存中未过期:强制缓存;
  • 请求的URI在web缓存中已过期,HTTP请求的消息头多了一行if-modified-since/if-none-match,使用对比缓存—问一下服务器,请求的资源有没有被修改过,服务器对比之后,若没有修改则返回304 not modified,浏览器收到后,从缓存里读内容;若有修改则服务器返回200 ok+返回新的内容;
    (2) F5/点击刷新按钮:对比缓存—浏览器就发送一个请求带上If-Modified-Since/if-none-match,服务器判断资源是否修改;
  • 浏览器会自行加上Cache-Control:max-age = 0(会覆盖初始的http响应的该字段,这时浏览器就会认为资源已过期)+If-Modified-Since/if-none-match ,即不管浏览器缓存中的文件过期了没有,都需要将请求发送到服务器进行确认;
    (3)Ctrl+F5:浏览器加上Cache-Control:no-cache;删除If-Modified-Since/if-none-match ,即客户端要求所有的中间服务器不返回缓存的资源,直接到服务器上重新下载,于是服务器的响应处理与首次请求这个资源一样,返回200 ok+资源内容; — 最慢,流量最大;
  1. 浏览器的缓存及清除
      浏览器是根据url进行缓存的—页面在不断发http请求,同一个请求url,会被浏览器缓存;
    清除缓存:在url中加一个随机数作为请求参数,当页面发起请求时,由于每次的URL地址不同,浏览器会当作不同的请求处理,而不再从缓存中获取

  2. 总结

  • 对于强制缓存:服务器通知浏览器一个缓存时间,在缓存时间内,下次请求直接用缓存,不在时间内,使用协商缓存;
  • 对于协商缓存:将缓存信息的Etag和Last-Modified通过请求发送给服务器,头服务器校验,返回状态码304/200;

你可能感兴趣的:(缓存)