web浏览器会自动缓存访问过的页面,当访问同一个页面的请求时,浏览器不再从服务器中重新下载页面而是优先使用本地缓存中的页面

为什么要进行web缓存

从用户的角度来看web缓存加快了上网速度,当然这是用户主观认为的增加了上网速度,从设计者的角度来看:
1.网络带宽的限制,也就是说在单位时间内,用户从网络上获取的信息是有着上限的,这就限制了用户的上网速度,而缓存可以造成一种加快上网速度的假象;
2.缓存可以有效的减少网络冗余信息的传输,即同一个页面如果用户每个一段时间就刷新一次,服务器中的页面并没有发生变化,如果用户每刷新一次服务器就传送一个新的页面这就造成了数据的冗余;
3.缓存可以有效地削弱瞬间拥塞现象;瞬间拥塞可能造成整个网络和服务器的崩溃;

虽然缓存有着种种好处,但是缓存并不是简简单单地在本地存储一个页面,缓存首先要面对的一个现实问题即网络上有海量的页面,总不能都缓存吧;为了解决这个问题,提出了缓存命中的概念(缓存命中这个概念显然是一个舶来品)所谓的缓存命中是指当一个请求所需的页面在本地缓存中,并且经过检测缓存的页面并没有在服务器发生变化,浏览器将使用本地缓存的页面(缓存页面的再检测也称为缓存页面的保鲜度,当浏览器发现所需的页面在本地缓存中,为了确定页面是否是最新的页面时,浏览器将向服务器发送一个请求询问页面是否是最新的,最新的依据就是页面的最后修改时间,若服务器发现页面是最新的,则返回一个应答,若发现页面不是最新的将会把最新的页面发送给浏览器)

缓存服务器

若将缓存单独地存放在一个服务器中,就形成了缓存服务器,缓存服务器的拓扑结构多种多样,有层次结构、网状结构和对等结构等,但是缓存服务器的处理流程基本相同:

新鲜度

页面总是可能随时间发生变化的,那如何保证页面总是最新的那?http协议提供文档过期时间和服务器再验证;
文档过期时间:

cacahe-control:maxAge/文档的相对过期时间

Expire: /文档的绝对过期时间

相对过期时间相对于绝对过期时间更好一些,因为绝对过期时间依赖于计算机时钟的本地设置;

服务器再验证
当文档的到期时间到了,但并不能说明文档在服务器端也发生了变化,因此此时就需要浏览器向服务器进行再验证,注意当服务器已经挂掉了,而缓存又需要验证,缓存就要返回一条错误信息;

条件验证
Http允许缓存向原始服务器发送一个条件get,将新鲜度检测和获取对象合并成一个get请求,请求服务器只有在文档和缓存的文档不一致时才会返回新的文档。

If-Modified-Since:<date> 如果从指定日期之后文档被修改过,就执行请求方法,可以与last—Modified服务器响应首部配合使用,只有在内容被修改后与已缓存的版本不同的时候才去获取内容。

If-None-Math:<tags>服务器可以提供特殊的标签,而不是将其与最近的修改日期相匹配,这些标签就像序列号一样,如果已缓存的标签和服务器的标签不同,则执行请求的方法,返回新的内容。

缓存设置
cache-control:no-store表示不再缓存中缓存文档
cache-control:no-cache表示可以在本地缓存文档,但在新鲜度检测之前不得返给浏览器,不管文档是否过期;
cache-control:maxage表示文档的最大缓存时间
Expire:表示文档的过期时间
cache-control:must-revaildate表示在文档过期后,必须进行新鲜度检测后才能返回给浏览器

探测性过期算法:
如果未设置cache-control,且文档有缓存线索即最后修改日期,浏览器可以运行探测性算法计算出一个大概的日期,其中LM-Factor算法如下:

   新的过期日期=server_date+(server_date-last_modified_time)*factor
   server_date:缓存和服务器会话时间
   factor:比例数

广告商的困劲

1.缓存清楚
2.缓存日志
3.命中计数

02-12 16:48