web缓存详解

转载 2015年07月10日 22:57:00

一、缓存的作用


1.减少网络带宽的消耗:

   缓存副本被使用时,只会产生极小的网络流量。

2.降低服务器负荷

  用户可以重复的使用本地缓存,减少对服务器的请求,间接降低服务器的压力。同时,搜素引擎的爬虫机器人也能根据过期机制降低爬取的频率,也能有效降低服务器的压力。

3.减少网络延迟,加快页面加载速度


二、缓存的基本知识

       1.  命中(hit)以及缺失(miss)

   缓存所带来的性能影响可以采用命中率和非命中率两个参数。命中指的是缓存直接响应客户端的请求,缺失指的是缓存不能响应到客户端的请求,然后将请求转发给远端的server。通俗的讲,前者是缓存直接将结果返回给server,而后者是缓存不存在,客户端直接从服务器获取结果。

      2. 重验证(revalidation)

   一般情况下,缓存的内容均存在一定的时效性,因此需要经常对缓存中的内容做有效性检查(fresh check),也叫“重验证”。触发对缓存中的内容重验证的方法很多,后面的章节将会介绍到。

                                                        


   上图描述了缓存命中、缺失以及重验证三种情形。重验证并不代表缓存中的内容一定过时的,它仅仅表示重验证触发条件收到,需要对缓存内容做重验证。

          3.   缓存的种类:

        缓存一般可以分成个人缓存(或者私有缓存)和共享缓存(“共有缓存”),比如在个人PC机上的缓存一般称为私有缓存,而对于门户网站,它们为了快速地响应各地用户请求,都会在CDN网络上建设自己的公共代理缓存(public proxy cache)。

 三、更新(keep copies fresh)

      首先要明白的是更新操作主要是为了保证缓存中的内容与服务器的内容保持一致,HTTP协议规范中规定流量两条途径:定义文档过期日期以及执行重验证。

   1.文档过期时间(Document Expire)


   针对文档过期时间,HTTP协议中规定了两种方式:第一种是在远端server为所回复的每一个文档附上“Expires:”HTTP头部;另外一种是为所回复的每一个文档附上缓存控制头部“cache-control:max-age=”。

  Cache-Control: max-age
The max-age value defines the maximum age of the document—the maximum legal elapsed time (in seconds) from when a document is first generated to when it can no longer be considered fresh enough to serve
  Expires
Specifies an absolute expiration date. If the expiration date is in the past, the document is no longer fresh.


      上面是两种方式的对比,值得注意的是,“cache-control:max-age=”头部是在HTTP/1.1中规定的,而“Expires”则是在HTTP/1.0中规定的,另外在RFC2616中规定,客户端在处理二者时,“cache-control:max-age=”头部具有更高的优先级。当规定的时间过期时,并不代表文档中的内容一定是过时的,它只是提醒缓存需要与远端的server做一致性检查--“重验证”。

     2.重验证(Revaliadtion)


    前面说过,当超过文档过期时间之后,客户端就必须做一致性检查,也就是本节将要阐述的“重验证”。很明显,重验证的目的就是去与远端server交互去判断缓存中的文档是否已经改变(或者说是否过时),若重验证之后表明文档做了修改,此时就需要重新从远端server下载一份最新的文档,代替缓存内容;若文档没有做修改,则只需获取从server端获取新的HTTP头部(可能包含新的过期时间),并更新缓存中的头部。
     下面主要阐述HTTP规范中所定义的几种常见重验证方法。其中具有代表性的是“If-Modified-Since”以及“If-None-Match”两种头部。下面列出了两种头部的作用及描述:

   Header
   description

If-Modified-Since:<date>
Perform the requested method if the document has been modified since the specified date. This is used in conjunction with the Last-Modified server response header, to fetch content only if the content has been modified from the cached version.
If-None-Match: <tags>
Instead of matching on last-modified date, the server may provide special tags (see “ETag”)on the document that act like serial numbers. The If-None-Match header performs the requested method if the cached tags differ from the tags in the server’s document.


 2.1.If-Modified-Since


  若server回复的报头中存在“Last-Modified”,那么客户端一定要在下一次请求报头中包含“If-Modified-Since”,所以说,这两个头部是相互对应的。那么当服务器收到客户端回复的“If-Modified-Since”头部之后会如何处理呢?首先服务器通过比较这两个时间,若“Last-Modified”更大,表明客户端缓存中的内容已经过时,此时server会将最新的文档(附上新的Header)返回客户端,并且状态码为200;否则认为客户端缓存中的内容仍然是最新的,只需向客户端返回304状态码,同时包含最新的HTTP头部。下面比较形象的显示了这两种处理情况。


 2.2.If-None-Match


  可以明显的看出,“If-Modified-Since”实现重验证主要是通过比较时间来完成的,但是在某种情况下,它并不能十分奏效:

  (1)服务器上的文档被后台周期性的重写,此时虽然日期发生变化,但是内容却没有发生任何变化。

  (2)虽然服务器上的内容发生改变,但是却只是一些不太重要的信息,比如拼写错误等等,这样就导致文档在客户端重载,显然开销过大。

  (3)一些web服务器上很难精确计算出文档的修改日期

  (4)对于实时系统而言(文档修改很难再很短的时间内完成),显然也显得无能为力。

 基于以上几点,HTTP规范定义了另外一种方式,即比较文档标签(Entity tags,Etags),它的基本思想是为每一个文档生成一个Etag,它可以是某个序列号,版本号或者检验。同样“If-None-Match”头部是与server端的“Etag”头部是相对应的,这样的server端只需要比较标签号就可以判断出客户端缓存中的文档是否是最新的。其处理方式与"If-Modified-Since"类似,下图是服务器与客户端的一种交互情况



四.缓存控制

HTTP规范中定义了服务器如何约束、限制客户端缓存的头部,按照优先级分别有: 

cache-control:no-store

cache-control:no-cache

cache-control:must-revalidate

cache-control:max-age

Expires

 (1) no-store,no-cache头

"no-store"头是用来禁止客户端缓存来自于server的回复。当客户端收到来自于server的回复之后,客户端缓存一边将回复转发给客户端,随后进行删除。
   
 "no-cache"头却不能阻止客户端将来自于server的回复缓存于本地,但是它限制本地cache不能在没有与远端server执行一致性检查的前提下直接响应用户。

【注意】从字面意思来讲,的确前者更加苛刻,然而不同的浏览器在具体实现时,却可能表现出不一样的行为。比如当IE浏览器收到“no-cache”头部的回复之后,它会一直与远端server做一致性检查;然而Firefox则不是这样,“no-cache”头部对它毫无作用,直接从缓存中响应用户请求,但是“no-store”头部却能起到相应的作用,因此,为了达到禁止本地缓存的目的,同时又要兼顾到浏览器的差异,server端应该同时回复“no-cache”和“no-store”头部。另外为了与HTTP/1.0兼容,需要加上“Pragma: no-cache”头部。
(2)  must-revalidate头
      “must-revalidate”头是为了要求缓存在响应用户请求之前一定要先保证缓存中的文档副本是最新的。
(3)  max-age与Expires头
      二者均是为了定义文档的过期时间,在客户端处理时,“max-age”均有更高的优先级,若max-age=0,则表示不能缓存文档或者每次访问缓存时前必须执行一致性检查。

五.    不同浏览器下页面刷新的问题

      本节主要是阐述在执行“F5”,“Ctrl+F5”等操作时各种浏览器的反映。F5通常是驱使浏览器去执行一次一致性检查;而“Ctrl+F5”则是在删除本地缓存的前提下,并驱使浏览器去执行一致性检查。

上图很好地总结了不同浏览器的反映情况,如对于Firefox,当执行F5时,会触发浏览器发出“If-Modified-Since”和“Cache-Control:max-age=0”头部的发送,当然这些都不是绝对的,例如当本地缓存为空时,如去执行F5,其实作用类似于Ctrl+F5。


web缓存详解

这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中。为了简要起见,某些实现方面的细节被简化或省略了。如果你更关心细节实现则完全不必耐心看完本文,后面参考...
  • eroswang
  • eroswang
  • 2008年03月14日 17:12
  • 1543

【Cache】web缓存详解 (转载)

这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中。为了简要起见,某些实现方面的细节被简化或省略了。如果你更关心细节实现则完全不必耐心看完本文,后面参考...
  • jamex
  • jamex
  • 2010年04月01日 13:46
  • 553

HTTP和Web缓存

1.HTTP概述 场景:想象一下你是木叶村的火影,现在你想同砂忍村的风影建交。你必须指派一名忍者来传达建交文书,为确保文书的完好,你指派的忍者必须非常可靠,无论遇到多么危险的情况,都能准确完好地将文...
  • wu371894545
  • wu371894545
  • 2017年03月03日 23:06
  • 14380

web缓存机制

Web缓存 Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,如果是相...
  • qq_24193261
  • qq_24193261
  • 2016年06月23日 19:45
  • 154

Web缓存工作原理

现代的商业化代理缓存相当的复杂。这些缓存构建的非常高效,可以支持HTTP和其他一些技术的各种高级特性。但除了一些微妙的细节之外,Web缓存的基本工作原理大多很简单。对一条HTTP GET报文的基本缓存...
  • okingniko
  • okingniko
  • 2016年05月24日 23:46
  • 1712

新型Web攻击技术——Web缓存欺骗

新型Web攻击技术——Web缓存欺骗
  • weixin_37647084
  • weixin_37647084
  • 2017年03月03日 13:57
  • 561

web缓存

本文介绍了缓存的概念和在web开发中缓存的作用,以及如何使用缓存。并用凤凰网的互动产品作为实例来分析。 缓存和缓存的作用 什么是缓存? 缓存就是用来避免频繁的到主存储器(一般来说可能是...
  • zwx3686306
  • zwx3686306
  • 2013年12月22日 10:19
  • 351

你应该了解的 一些web缓存相关的概念.

你应该了解的 一些web缓存相关的概念.
  • super_scan
  • super_scan
  • 2014年08月09日 21:43
  • 618

Web缓存

作者:老王Web缓存最权威的资料就属RFC了,可惜它太过言简意赅,本文将对缓存做一些通俗易懂的介绍。为了演示体现缓存的作用,先删除所有的浏览器缓存,然后以如下四种方式访问baidu网站,期间使用Pag...
  • phphot
  • phphot
  • 2008年11月22日 00:16
  • 866

WEB缓存

原文(英文)地址: http://www.mnot.net/cache_docs/  版权声明:署名-非商业性使用-禁止演绎 2.0 这是一篇知识性的文档,主要目的是为了让Web缓存相关概念...
  • wb96a1007
  • wb96a1007
  • 2012年12月25日 19:30
  • 315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:web缓存详解
举报原因:
原因补充:

(最多只允许输入30个字)