缓存
Posted 空方块
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存相关的知识,希望对你有一定的参考价值。
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.使用期的计算
以上是关于缓存的主要内容,如果未能解决你的问题,请参考以下文章