Web缓存是可以自动保存常见文档副本的HTTP 设备。当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档。使用缓存有下列优点。
·缓存减少了冗余的数据传输,节省了你的网络费用。
·缓存缓解了网络瓶颈的问题。不需要更多的带宽就能够更快地加载页面。·缓存降低了对原始服务器的要求。服务器可以更快地响应,避免过载的出现。·缓存降低了距离时廷,因为从较远的地方加载页面会更慢一些。
本章解释了缓存是怎样提高性能降低费用的、如何去衡量其有效性以及将缓存置于何处可以发挥它的最大作用。我们还会解释HTTP 如何保持已缓存副本的新鲜度,缓存如何与其他缓存和服务器通信等问题。
7.1冗余的数据传输
有很多客户端访问一个流行的原始服务器页面时,服务器会多次传输同一份文档,每次传送给一个客户端。一些相同的字节会在网络中一遍遍地传输。这些冗余的数据传输会耗尽昂贵的网络带宽,降低传输速度,加重Web服务器的负载。有了缓存,就可以保留第一条服务器响应的副本,后继请求就可以由缓存的副本来应对了,这样可以减少那些流入/流出原始服务器的、被浪费掉了的重复流量。
7.3瞬间拥塞
缓存在破坏瞬间拥塞(Flash Crowds)时显得非常重要。突发事件(比如爆炸性新闻、批量E-mail 公告,或者某个名人事件)使很多人几乎同时去访问一个Web文档时,就会出现瞬间拥塞(参见图7-2)。由此造成的过多流量峰值可能会使网络和Web服务器产生灾难性的崩溃。
1998年9月11日,详细描述Kenneth Starr对美国总统克林顿调查情况的“Starr报告”发布到因特网上去的时候,美国众议院的Web服务器每小时收到了超过三百万次的请求,是其平均服务器负荷的50倍。据报道,新闻站点CNN.com的服务器每秒钟平均会收到超过50 000次的请求。
7.4距离时延
即使带宽不是问题,距离也可能成为问题。每台网络路由器都会增加因特网流量的时延。即使客户端和服务器之间没有太多的路由器,光速自身也会造成显著的时延。波士顿到旧金山的直线距离大约有2700英里。在最好的情况下,以光速传输(186 000英里/秒)的信号可以在大约15毫秒内从波士顿传送到旧金山,并在30毫秒内完成一个往返。2
假设某个Web页面中包含了20个小图片,都在旧金山的一台服务器上。如果波士顿的一个客户端打开了4条到服务器的并行连接,而且保持着连接的活跃状态,光速自身就要耗费大约1/4秒(240毫秒)的下载时间(参见图7-3)。如果服务器位于(距离旧金山6700英里的)东京,时延就会变成600毫秒。中等复杂的 Web 页面会带来几秒钟的光速时延。
将缓存放在附近的机房里可以将文件传输距离从数千英里缩短为数十米。
7.5命中和未命中的
这样看来缓存是有所帮助的。但缓存无法保存世界上每份文档的副本。3
可以用已有的副本为某些到达缓存的请求提供服务。这被称为缓存命中(cachehit),参见图7-4a。其他一些到达缓存的请求可能会由于没有副本可用,而被转发给原始服务器。这被称为缓存未命中(cache miss),参见图7-4b。
7.5.1再验证
原始服务器的内容可能会发生变化,缓存要不时对其进行检测,看看它们保存的副本是否仍是服务器上最新的副本。这些“新鲜度检测”被称为HTTP再验证(revalidation)(参见图7-4c)。为了有效地进行再验证,HTTP定义了一些特殊的请求,不用从服务器上获取整个对象,就可以快速检测出内容是否是最新的。
7.5.2命中率
由缓存提供服务的请求所占的比例被称为缓存命中率(cache hit rate,或称为缓存
命中比例),*有时也被称为文档命中率(document hit rate)。命中率在0到1之间,但通常是用百分数来描述的,0%表示每次请求都未命中(要通过网络来获取文档),100%表示每次请求都命中了(在缓存中有一份副本)。5
缓存的管理者希望缓存命中率接近100%。而实际得到的命中率则与缓存的大小、缓存用户兴趣点的相似性、缓存数据的变化或个性化频率,以及如何配置缓存有关。命中率很难预测,但对现在中等规模的Web缓存来说,40%的命中率是很合理的。缓存的好处是,即使是中等规模的缓存,其所包含的常见文档也足以显著地提高性能、减少流量了。缓存会努力确保将有用的内容保存在缓存中。
7.5.3字节命中率
由于文档并不全是同一尺寸的,所以文档命中率并不能说明一切。有些大型对象被访问的次数可能较少,但由于尺寸的原因,对整个数据流量的贡献却更大。因此,有些人更愿意使用字节命中率(byte hit rate)作为度量值(尤其那些按流量字节付费的人!)。
字节命中率表示的是缓存提供的字节在传输的所有字节中所占的比例。通过这种度量方式,可以得知节省流量的程度。100%的字节命中率说明每个字节都来自缓存,没有流量流到因特网上去。
文档命中率和字节命中率对缓存性能的评估都是很有用的。文档命中率说明阻止了多少通往外部网络的Web事务。事务有一个通常都很大的固定时间成分(比如,建立-一条到服务器的TCP连接),提高文档命中率对降低整体延迟(时延)很有好处。字节命中率说明阻止了多少字节传向因特网。提高字节命中率对节省带宽很有利。
7.6缓存的拓扑结构
缓存可以是单个用户专用的,也可以是数千名用户共享的。专用缓存被称为私有缓存(private cache)。私有缓存是个人的缓存,包含了单个用户最常用的页面(参见图7-7a)。共享的缓存被称为公有缓存(public cache)。公有缓存中包含了某个用户团体的常用页面(参见图7-7b)。
7.6.4网状缓存、内容路由以及对等缓存
有些网络结构会构建复杂的网状缓存(cache mesh),而不是简单的缓存层次结构。网状缓存中的代理缓存之间会以更加复杂的方式进行对话,做出动态的缓存通信决策,决定与哪个父缓存进行对话,或者决定彻底绕开缓存,直接连接原始服务器。这种代理缓存会决定选择何种路由对内容进行访问、管理和传送,因此可将其称为内容路由器(content router)。
网状缓存中为内容路由设计的缓存(除了其他任务之外)要完成下列所有功能。根据URL在父缓存或原始服务器之间进行动态选择。
根据URL动态地选择一个特定的父缓存。
前往父缓存之前,在本地缓存中搜索已缓存的副本。
允许其他缓存对其缓存的部分内容进行访问,但不允许因特网流量通过它们的缓存。
7.7缓存的处理步骤
现代的商业化代理缓存相当地复杂。这些缓存构建得非常高效,可以支持 HTTP和其他一些技术的各种高级特性。但除了一些微妙的细节之外,Web缓存的基本工作原理大多很简单。对一条HTTP GET 报文的基本缓存处理过程包括7个步骤(参见图7-11)。
(1)接收——缓存从网络中读取抵达的请求报文。
(2)解析——缓存对报文进行解析,提取出URL和各种首部。
(3)查询——缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保
存在本地)。
(4)新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是
否有任何更新。
(5)创建响应-—缓存会用新的首部和已缓存的主体来构建一条响应报文。(6)发送—-—缓存通过网络将响应发回给客户端。
(7)日志——缓存可选地创建一个日志文件条目来描述这个事务。
7.8.1文档过期
通过特殊的HTTP cache-Control首部和Expires首部,HTTP 让原始服务器向每个文档附加了一个“过期日期”(参见图7-13)。就像一夸脱牛奶上的过期日期一样,这些首部说明了在多长时间内可以将这些内容视为新鲜的。
HTTP/1.0 20o ox
HTTP/1.0 200 ox
Date: Sat, 29 Jun 2002,14:30:00 GMT
Date: Sat, 29jun 2002,14:30:0o GHT
content-type:. text7piain
Content-type:. text/plain
content-iength: 67
content-iength: 67
Expires: Fi,05Jul 2002,o5:00:00 GT
cache-Contr8i:max-age-484200
Independence Day sale at Joe's Hardware
Independence Day sale at Joe' s Hardware
come shop with us todayl
Come shop with us todayl
(a)Expires首部
(b)Cache-Control: max-age首部
图7-13 Bxpires首部和cache-Contro1首部
在缓存文档过期之前,缓存可以以任意频率使用这些副本,而无需与服务器联系——当然,除非客户端请求中包含有阻止提供已缓存或未验证资源的首部。但一旦已缓存文档过期,缓存就必须与服务器进行核对,询问文档是否被修改过,如果被修改过,就要获取一份新鲜(带有新的过期日期)的副本。
7.8.4 用条件方法进行再验证
HTTP的条件方法可以高效地实现再验证。HTTP允许缓存向原始服务器发送一个“条件GET”,请求服务器只有在文档与缓存中现有的副本不同时,才回送对象主体。通过这种方式,将新鲜度检测和对象获取结合成了单个条件 GET。向GET请求报文中添加一些特殊的条件首部,就可以发起条件GET。只有条件为真时,web服务器才会返回对象。
HTTP定义了5个条件请求首部。对缓存再验证来说最有用的2个首部是If-Modified-since和If-None-Match。"所有的条件首部都以前缀“If-”开头。表7-3列出了在缓存再验证中使用的条件请求首部。
7.9控制缓存的能力
服务器可以通过HTTP定义的几种方式来指定在文档过期之前可以将其缓存多长时间。按照优先级递减的顺序,服务器可以:
·附加一个cache-Control : no-store首部到响应中去,·附加一个cache-Control : no-cache首部到响应中去,
·附加一个cache-Control : must-revalidate首部到响应中去,·附加一个 Cache-Control : max-age首部到响应中去;
·附加一个Expires日期首部到响应中去;
·不附加过期信息,让缓存确定自己的过期日期。
本节描述了缓存控制首部。下一节,也就是7.10节介绍了如何为不同的内容分配不同的缓存信息。