1、Web缓存是可以自动保存常见文档副本的HTTP设备,可以缓解网络的瓶颈问题,破坏瞬间拥塞(很多人几乎同时去访问一个Web文档时就会出现)


2、用已有的副本为某些到达缓存的请求提供服务,这被称为缓存命中。原始服务器的内容可能发生变换,缓存要不时对其进行检测,看看它们保存的副本是否仍是服务器上最新的副本。这些“新鲜度检测”被称为HTTP再验证。为了有效地进行再验证,HTTP定义了一些特殊的请求,不用从服务器上获取整个对象,就可以快速检测除内容是否是最新的。但由于缓存中通常会包含数百万的文档,而且网络带宽是很珍贵的,所以大部分缓存只有在客户端发起请求,并且副本旧的足以需要检测的时候,才会对副本进行再验证。


3、HTTP为我们提供了即个用来对已缓存对象进行再验证的工具,最常用的是If-Modified-Since首部。将这个首部添加到GET请求中,就可以告诉服务器,只有在缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象。这里列出了3种情况下服务器收到GET If-Modified-Since请求时会发生的情况:

再验证命中:如果服务器对象未被修改,服务器会向客户端发送一个小的HTTP 304 Not Modified响应。

再验证未命中:如果服务器对象与已缓存副本不同,服务器向客户端发送一条普通的,带有完整内容的HTTP 200 OK响应。

对象被删除:如果服务器对象已经被删除了,服务器就回送一个404 Not Found响应,缓存也会将其副本删除。


4、由缓存提供服务的请求所占的比例被称为缓存命中率。0%表示每次请求都未命中,100%表示每次请求都命中。由于文档并不全是同一大小的,所以缓存命中率并不能说明一切。有些人更愿意使用字节命中率作为度量。字节命中率表示的是缓存提供的字节在传输的所以字节中所占的比例。100%表示每个字节都来自缓存,没有流量流到网上去。

不幸的是,HTTP没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器得到的。客户端有一种方法可以判断响应是否来自缓存,就是使用Date首部。将响应中的Date首部与当前时间比较,若响应中的日期值比较早,客户端通常就可以认为这是一条缓存的响应。


5、缓存的拓扑结构

为个人使用的缓存被称为私有缓存。Web浏览器中有内建的私有缓存。为用户共享的缓存被称为公有换从。公有缓存是特殊的共享代理服务器,被称为缓存代理服务器,亦被称为代理缓存。代理缓存可以通过指定手工代理,或者通过代理自动配置文件,将浏览器配置为使用代理缓存。

在层次化的缓存中,在靠近客户端的地方使用小型廉价缓存,而更高层次中哦功能,则逐步采用更大、功能更强的缓存来装载多用户共享的文档。在较小缓存中未命中的请求会被导向较大的父缓存中。

有些网络结构会构建复杂的网状缓存。网状缓存中的代理缓存之间会以更加复杂的方式进行对话,做出动态的缓存通信决策,决定与哪个父缓存进行对话,或者决定彻底绕开缓存,直接连接原始服务器。这种代理缓存会决定选择何种路由对内容进行访问、管理和传送,因此可将其称为内容路由器。

缓存之间这些更为复杂的关系允许不同的组织互为对等实体,将它们的缓存连接起来以实现共赢。提供可选的对等支持的缓存被称为兄弟缓存。HTTP并不支持兄弟缓存,所以人们通过一些协议对HTTP进行了扩展,比如ICP和HTCP。


6、缓存的处理步骤

(1)接收——缓存从网络中读取抵达的请求报文

(2)解析——缓存对报文进行解析,提取出URL和各种首部

(3)查询——缓存查找本地副本,本地副本可能存储在内存、本地磁盘,甚至附近的另一台计算机中。若没有则获取一份副本

(4)新鲜度检测——一旦已缓存副本停留的时间太长,超过了文档的新鲜度限值,就认为对象果实了,在提供该文档之前,缓存要再次与服务器进行确认,以查看文档是否发生了变化。

(5)创建响应——缓存将已缓存的服务器响应首部作为响应首部的起点,然后对这些首部进行修改和扩充。但是缓存不应该调整Date首部

(6)发送——缓存通过网络将响应发回给客户端。

(7)日志——缓存可选地创建一个日志文件条目来描述这个事务。


7、文档过期

通过特殊的HTTP Cache-Control首部和Expires首部,HTTP让原始服务器向每个文档附加了一个“过期日期”。一旦过期,就要获取一份新鲜的副本。Cache-Control后面跟一个相对时间值。而Expires后面跟一个绝对时间值。因为客户端上的时间差异,用相对时间值比较好。


8、服务器再验证

当然,过期后要进行再验证。若再验证显式内容发生了变化,就会获取一份新的文档副本。若没有发生变化,缓存只需要获取新的首部,包括一个新的过期日期。


9、If-Modified-Since:Date再验证

若自指定日期后,文档被修改了,会指示服务器执行请求。鞋带新首部的新文档会被返回给缓存。若文档没被修改过,条件为假,会向客户端返回一个小的304 Not Modified响应报文。


10、If-None-Match:实体标签再验证

实体标签是附加到文档上的任意标签,它们可能包含了文档的序列号或版本名,或者是文档内容的校验和其他指纹信息。当发布者对文档进行修改时,可以修改文档的实体标签来说明这个新的版本。这样缓存可以用If-None-Match条件首部来GET文档的新副本。


11、控制缓存的能力

服务器可以通过HTTP定义的几种方式来指定在文档过期之前可以将其缓存多长时间。

Cache-Control:no-store:禁止缓存对响应进行复制

Cache-Control:no-cache:可以存储在本地缓存区中,只是在与原始服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用。

Cache-Control:must-revalidate:在事先没有跟原始服务器进行再验证的情况下,不能提供这个对象的陈旧副本。

Cache-Control:max-age:从服务器将文档传来之时其,可以认为此文档处于新鲜状态的秒数。

Expires:绝对日期