缓存

来源:互联网 发布:linux内核分析及编程 编辑:程序博客网 时间:2024/06/04 20:01

1.冗余的数据传输

缓存可以处理冗余数据的传输。很多客户端访问一个流行页面时,服务器多次传输同一份文档,每次传送给一个客户端,相同的字节一遍遍传输。耗费了带宽,降低了传输速度,加重服务器负载。

2.带宽瓶颈

缓存可以缓解网络带宽瓶颈问题。很多本地网络带宽比远程服务器带宽要宽,客户端会以路径上最慢的网速访问服务器。若在快速局域网的缓存中得到一个副本,缓存可以提高性能。


3.瞬间拥塞

很多人几乎同时去访问一个Web文档时,会造成瞬间拥塞,造成的过多流量峰值会使网络和Web服务器产生灾难性的崩溃。

4.距离时延

即使带宽没有问题,客户端和服务器之间没有太多路由器,光速自身也会造成显著的时延。

5.命中和未命中

缓存是有所帮助,但是无法保存世界上所有文档的副本。

5.1.再验证

缓存要不时对其进行检测,看看它保存的副本是否仍是服务器上最新的副本。


缓存可以在任意时刻,以任意的频率对副本进行再验证。

缓存对缓存的副本进行再验证时,会向原始服务器发送一个小的再验证请求。如果内容没有变化,则返回304 Not Modified进行响应。



#1:再验证未命中

若服务器对象与缓存副本不同,则会向客户端发送一条普通的、带有完整内容的HTTP 200 OK的响应。

#2:对象被删除

若服务器对象已被删除了,服务器会回送一条404 Not Found响应,缓存也将副本删除。

5.2.命中率

缓存的管理者都希望缓存命中率能接近100%。而实际得到的命中率则与缓存的大小、缓存用户兴趣点的相似性、缓存数据的变化或个性化频率,以及如何配置缓存相关。命中率较难预测,对于现在中等规模的Web缓存,40%命中率较为合理。

5.3.字节命中率

由于文档都不是同一个尺寸,所以文档命中率不能说明一切。有些人更愿意使用字节命中率作为度量值。

字节命中率表示缓存提供的字节在传输的所有字节中所占的比例。通过这种方式,可以知道节省流量的程度。

文档命中率阻止Web事务请求原始服务器,事务有很大的固定时间成本(如,建立TCP连接),降低时延。

字节命中率阻止字节请求原始服务器,节省带宽。

6.缓存的拓扑结构

6.1.私有缓存

不需要很大的动力或存储空间,可以做得很小。如,浏览器的缓存文件夹。

6.2.公有代理缓存

公有缓存是特殊的共享代理服务器,称为缓存代理服务器或代理缓存。


6.3.代理缓存的层次结构


在缓存层次结构很深的情况下,请求可能穿过很长的缓存,单每个拦截代理都会添加一些性能损耗,若代理链路很长时,这种性能损耗变得很明显。

6.4.网状缓存、内容路由以及对等缓存

#1:根据URL在父缓存或原始服务器之间进行动态选择;

#2:根据URL动态地选择一个特定的父缓存;

#3:前往父缓存之前,在本地缓存中搜索已缓存的副本;

#4:允许其他缓存对其缓存的部分内容进行访问,但不允许Internet流量通过他们的缓存。

7.缓存的处理步骤

#1:接收--缓存从网络中读取抵达的请求报文;

#2:解析--缓存对报文进行解析,提取出URL和各种首部;

#3:查询--缓存查看是否有本地副本可用,否则,则获取一份副本;

#4:新鲜度检测--缓存查看已缓存副本是否足够新鲜,否则,就询问服务器是否有任何更新;

#5:创建响应--缓存会有新的首部和已缓存的主体来构建一条响应报文;

#6:日志--缓存可选地创建一个日志文件条目来描述这个事务。


8.保持副本的新鲜



8.1.文档过期


通过HTTP Cache-Control首部和Expire首部,来让原始服务器向每个文档附加一个"过期日期"。

过期前,缓存可以以任意频率去使用这些副本,无需向服务器联系。

若过期,缓存必须与原始服务器进行核对,询问文档是否被修改过,若被修改,则获取一份新鲜的(带有新的过期日期)副本。

8.2.服务器再验证

对于缓存再验证可以使用If-Modified-Since和If-None-Match这俩个首部。



使用情景:

If-Modified-Since:若服务器回送Last-Modified;

If-None-Match:若服务器回送实体标签。

9.新鲜度详细算法

9.1.试用期和新鲜生存期

缓存只需要计算俩个值:已缓存的试用期(age),和已缓存副本的新鲜生存期(freshness_lifetime)。

用Perl表示:

¥is_fresh_enough = ($age < $freshness_lifetime);

有些客户端可能愿意接收有些过期的文档(使用Cache-Control: max-stale首部)

有些客户端可能无法接收会在近期过期的文档(使用Cache-Control:min-fresh首部)。

9.2.使用期的计算


0 0