《HTTP权威指南》– 7.缓存

使用缓存的优势:

  1. 减小了数据的数据传输,节省了网络费用;
  2. 缓解了网络瓶颈的问题,不须要更多的带宽就能更快地加载页面;
  3. 下降了原始服务器的要求,服务器能够更快地响应、避免过载出现;
  4. 下降了距离时延,由于比较远的地方加载页面会慢一些;

HTTP为咱们提供了几个用来对已缓存对象再验证的工具,但最经常使用的是 IF-Modified-Since首部。将这个首部添加到 GET 请求中去,就能够通知服务器:只有在缓存了对象的副本以后,又对其进行了修改的状况下,才发送此对象。浏览器

服务器对象未被修改: 服务器向客户端发送一个小的 HTTP 304 Not Modified 响应;
服务器对象与已缓存对象不一样: 服务器向客户端发送一条普通的、带有完整内容的 HTTP 200OK 响应;
服务器对象不存在: 服务器回送一个 404 Not Found 响应,缓存将其副本删除;缓存

HTTP没有为用户提供一种手段来区分响应是缓存命中的仍是访问原始服务器获得的。在这两种状况下,响应码都是 200 OK服务器

客户端 有一种方法能够判断相应是否来自缓存,就是使用 Date首部。将响应中Date首部的值与当前时间进行比较,若是响应中的日期值比较早,客户端一般就能够认为这是一条缓存的响应。网络

缓存的拓扑结构:

缓存但是单个用户专用的,也能够是若干名用户共享的。专用缓存被称为 私有缓存 (我的缓存,包含了单个用户最经常使用的页面),共享的缓存被成为 公有缓存(包含了某个用户团体的经常使用页面)。工具

缓存的处理步骤:

  1. 接收:缓存从网络中读取抵达的请求报文;
  2. 解析:缓存对报文进行解析,提取出URL和各类首部;
  3. 查询:缓存查看是否有本地副本可用,若是没有,就获取一份副本(并将其保存在本地);
  4. 新鲜度检测:缓存查看已缓存副本是否足够新鲜,若是不是,就询问服务器是否有更新;
  5. 建立响应:缓存会同新的首部和已缓存的主体来构建一条响应报文;
  6. 发送:缓存经过网络将响应发回给客户端;
  7. 日志:缓存可选地建立一个日志文件条目来描述这个事物;

文档过时:

经过特殊的 HTTP Cache-Control 首部 和 Expires 首部, HTTP 让原始服务器向每一个文档附加了一个 过时时间。在缓存文档过时以前,缓存可任意频率使用这些副本,而无需与服务器联系,固然,除非客户端请求中包含有阻止提供已缓存或未验证资源的首部。spa

若是文档过时了,并不意味着它和原始服务器上目前处于活跃状态有实际的区别,仅仅意味着到了要进行核对时间了,这种状况被为 服务器再验证,说明缓存须要询问原始服务器文档是否发生了变化。若是文档发生了变化,缓存会获取一份新的文档副本,并将其存储在旧文档的位置上,而后将文档发送给客户端。若是文档没有发生变化,缓存只须要获取新的首部,包括一个新的过时日期,并对缓存中的首部进行更新便可。代理

HTTP协议缓存要求

HTTP协议要求行为正确的缓存返回下列内容之一:日志

  1. 足够新鲜的 已缓存副本;
  2. 与服务器进行过再验证,确认其仍然新鲜的已缓存副本;
  3. 若是须要与之进行再验证的原始服务器出现了故障,就返回一条错误报文;
  4. 附有警告信息说明内容可能不正确的已缓存对象;
实体标签再验证: If – None – Match

实体标签 是附加到文档上的任意标签。它们可能包含了文档的序列号或版本号,或者是文档内容的校验及其余信息。当发布者对文档进行了修改时,能够修改文档的实体标签来讲明这个新的版本。这样若是实体标签被修改了,缓存就能够用 If – None – Mach 条件首部来 GET 文档的新副本了。实体标签和修改日期都是 缓存验证器code

控制缓存:

服务器能够经过 HTTP 定义的几种方式来指定在文档过时以前能够将其缓存多长时间,按照优先级顺序:对象

能够将如下首部信息附加到响应中:

1. Cache – Control :no-store
禁止缓存对响应进行复制。缓存一般会向非缓存代理服务器同样,向客户端转发一条no-store响应,而后删除对象

2.Cache – Control :no-cache
标识为no-cache的响应其实是能够存储在本地缓存区中的,只是在原始服务器进行新鲜度再验证以前,缓存不能将其提供给客户端使用

3.Cache – Control :must-revalidate

4.Cache – Control :max-age 
表示从服务器将文档传来之时起,文档的新鲜状态剩余秒数,服务器能够将 Cache–Control:max-age 设置为0,从而在每次访问的时候都进行刷新

5.Cache – Control :Expires
不附加过时信息,让缓存肯定本身的过时日期。

经过 HTTP-EQUIV 控制HTML缓存:

将HTML文档设置为非缓存的:

<META HTTP-EQUIV = "cache-control"  Content = "no -cache" >

<META HTTP-EQUIV > 标签并非控制文档缓存特性的好方法。由于支持 HTTP-EQUIV 标签 的HTML浏览器使用的 Cache-Control 规则可能会与拦截代理缓存所使用的规则有所不一样,这样就会使缓存的过时处理行为发生混乱。因此由通过正确配置的服务器发送
的 HTTP首部 来交流对文档的缓存控制请求是惟一可靠的办法。

相关文章
相关标签/搜索