为什么要缓存?

  1. 缓存减少了冗余的数据传输,节省了网络费用
  2. 缓存环节了网络瓶颈的问题,不需要更多的宽带就能够更快的加载页面
  3. 缓存降低了对原始服务器的要求,服务器可以更快的响应,避免过载的出现
  4. 缓存降低了距离时延,因为从较远的地方加载页面会慢一些

关键名词

  1. 缓存命中---可以用已有的副本为某些到达缓存的请求提供服务
  2. 缓存未命中--到达缓存的请求可能由于没有副本可用,而被转发给原始服务器
  3. 新鲜度检测--原始服务器的内容可能发生变化,缓存要时不时的进行检测,看看它们保存的副本是否是服务器上最新的副本

上图说明缓存命中、未命中以及再验证

HTTP之缓存总结

缓存处理流程图和步骤

HTTP之缓存总结

缓存的副本新鲜度检测机制之文档过期

    通过特殊的HTTP Cache-Control首部和Expires首部,原始服务器向每个文档附加一个【过期日期】,说明了在多长时间内可以将副本视为新鲜的

HTTP之缓存总结

服务器用 HTTP/1.0+ 的 Expires 首部或 HTTP/1.1 的 Cache-Control: max-age 响应首 部来指定过期日期,同时还会带有响应主体。两个做的事情是一样的,不同的是Expires使用的是绝对日期,Cache-Control使用的是相对日期,Expires的绝对日期依赖本地环境,建议使用Cache-Control

  •     需要注意文档过期如果不小心分配了很久之后的过期日期,容易导致无法更新

新鲜度检测机制之用条件方法进行再验证

      仅仅是文档过期了,并不能说明副本跟服务器的文档不一致,这只是意味着到了要进行核对的时间了。这种情况称为【服务器再验证】证明缓存需要询问原始服务器文档是否发生了变化。

  1. 如果再验证显示内容发生了变化,缓存会获取一份新的文档副本,并将其存储在旧文档的位置上,然后将文档发送给客户端
  2. 如果再验证显示内容没有发生变化,缓存只需要获取新的首部,包括一个新的过期日期,并对缓存中的首部进行更新就可以

If-Modified-Since:<date>    如果从指定日期之后文档被修改过了,就执行请求的方法。可以与Last-Modify服务器响应首部配合使用,只有在内容被修改后与已缓存版本有所不同的时候才去获取内容

If-None-Match:<date>    服务器可以为文档提供特殊的标签【ETag】,而不是将其与最近修改日期相匹配,这些标签就像序列化一样。如果已缓存标签与服务器文档中的标签有所不同,If-None-Match首部就会执行所请求的方法

 控制缓存的能力

      服务器可以通过HTTP定义的几种方式来指定在文档过期之前可以将其缓存多长时间,按照优先级递减的顺序,服务器可以附件Cache-Control

  1. Cache-Control:no-store    缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会含有敏感信息
  2. Cache-Control:no-cache   除非资源进行了再验证,否则这个客户端不会接受已缓存的资源
  3. Cache-Control:must-revalidate   在事先没有跟原始服务器进行再验证的情况下,不能提供这个对象的陈旧副本。缓存仍然可以随意提供新鲜的副本。如果在缓存进行 must-revalidate 新鲜度检查时,原始服务器不可 用,缓存就必须返回一条 504 Gateway Timeout 错误
  4. Cache-Control:max-age
  5. 附加一个Expires日期到响应中去
  6. 不附加过期信息,让缓存确定自己的过期日期

Cache-Control:private   只能自己缓存,而不能被代理服务器缓存

Cache-Control:public     可以被任何对象缓存

 

相关文章: