`
wangrl
  • 浏览: 148599 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何利用HTTP缓存提高网页性能

阅读更多
http://blogold.chinaunix.net/u1/45336/article_134715.html

网站的性能(Performance)要考虑两方面,一方面是在Server端的运行效率,另一方面是在Client端感受到的效率。不要以为Server端效率高这个网站或者服务给用户的体验就是高效的,如果不考虑影响Client Performance的因素,Server端跑得再快用户也可能感觉慢得和牛一样。

Yahoo的哥们做的研究真不是盖的,他们还写了本书《High Performance Web Sites》详细介绍如果提高Client Performance。公司内部也有一个Team做这方面的事情,听过他们的培训,和Yahoo说的差不多,所谓英雄所见略同。

给静态资源(HTML文件,图片文件等)的Repsone加上Expires/Cache-Control Header是很有效的一招。如果HTTP Response中有Expires这样的Header的话,浏览器会Cache这个资源,理想状况下(注意,只是理想状况),在Expire Date之前,不会再发HTTP请求给Server要这个资源,不过Expires的值只能是一个固定日期,比如“Thu 27 Nov 2008 07:00:00 GMT”,不能是一个类似“从现在开始之后10年”这样一个随机浮动的值,如果要这样的效果,可以用Cache-Control这样的Header,如果HTTP Resposne中有这样的Header:“Cache-Control: max-age = 100”,表示这个资源在cache中的最大寿命是100秒。一般说来这种静态文件永远不应该过期,如果真的要给这个Cache加上一个期限,那我希望是——一万年,“Cache-Control: max-age = 315360000000”;

其实就应该给Expires设一个永远不会过期的时间,比如你现在有一个文件叫logo.gif,需要用一个新的logo的时候,你不要去覆盖原来的文件,而把新的logo存成logo_v2.gif,让相关网页引用新的logo_v2.gif,这样可以让新老网页同时工作,实在犯不上为了节省存储空间覆盖原有文件。

对Apache服务器,使用mod_expires,在httpd.conf或者.htaccess中加上

<FilesMatch "\\.(ico|gif|jpg|html)$">

ExpiresDefault "access plus 10 years"

</FileMatch>

还有,同一个HTTP Response中可以同时有Expires和Cache-Control,但是Cache-Control权限比Expires大,会override它的。

HTTP的Response中还会有另外一个Header叫Last-Modified,比如“Last-Modified: Thu, 06 Apr 2006 21:17:12 GMT”,浏览器访问一个URI得到这样的Resposne之后,就知道这个资源最后一次的修改时间,下次需要再次获得这个资源的时候,会发一个Request给Server,不过这个Request中有一条“If-Unmodified-Since: Thu, 06 Apr 2006 21:17:12 GMT”,如果在Server端在这个日期之后对这个资源进行了修改,就会照常返回这个资源给Client端,但是如果没有修改,就会返回一个304 (Not Modified) Response而不返回资源,告诉Client端:“这个资源从上次给你之来从来没改过,你放心用你Cache中的好了。” 一个304 Response比一个静态资源通常小多了,这样就节省了网络带宽。

让我们回过头来比较一下Expires和Last-Modified这两个东西,似乎Last-Modified比不上Expires,因为虽然它能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而Expires却使得浏览器干脆连HTTP请求都不用发,岂不痛快!那还要Last-Modified这个物体干什么?理想状况的确是这样,不过当用户在IE或者Firefox里面按F5或者点击Refresh按钮的时候(不是在URL栏里重新输入一遍URL然后回车),就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是要用的,而且要和Expires一起用。

除了Last-Modified,HTTP Response中还可能有另外一个Header: ETag,使得Server上的静态资源有点“版本控制”的味道;假如HTTP Response中包含“ETag: "abcdefg1234:0001"”,等于告诉Client端,你拿到的这个版本的资源有个ID,叫做abcdefg1234:0001,下次需要发Request索要同一个URI的时候,在Request里面加一条“If-None-Match: "abcdefg1234:0001"”,好,Server端做了一些修改,下次这个Client再来了一个请求,但是这时候资源已经改了,所以返回这个新资源,还有新的tag “ETag: "abcdefg4567:0001"”(这个etag我是胡写的),这样,Client端等于Cache了两份,在需要索要这个资源的时候,可以包含这样的Header: “If-None-Match: "abcdefg1234:0001" "abcdefg4567:0001"”,这样,即使Server端头脑发热,把这个资源Roll back回原来的版本,依然会返回304 (Not Modified) Response,因为它知道Client端Cache着以前的版本呢,这点功能是Last-Modifed/If-Not-Modified没法做到的。

不过ETag/If-None-Match这点功能实在是个鸡肋,首先,Server端的资源不大可能Roll Back,更重要的是,有可能造成Client Performance下降。对于只有一个Server的网站,没什么问题,但是现在稍微上点规模的网站都需要Scale Out,也就是说需要前端一个Load Balancer,后面接多台Server来处理请求,俗称Cluster,既然是Cluster,那么每个请求到底返回什么结果应该和分配到哪个Server无关,不过这个ETag可能就坏事了。假如用户的第一次请求分配给Server A,返回“ETag: "abcdefg1234:0001"”,但是第二次请求分配给了Server B,Server B上这个资源和Server A上的一模一样,但是计算出这个资源的ETag是"abcdefg1234:0002",这下麻烦了,虽然内容一样,但是ETag不匹配,还是浪费了带宽把资源发送了一遍,冤枉啊!而事实上,不同Server上的ETag很有可能不同,对于Apache,ETag的计算考虑了inode,对于IIS,ETag考虑了metabase的修改版本,要保证不同server上的这些信息一致,有点小难。不过不是有Last-Modified/If-Not-Modified吗?Server端看到If-Modified-Since,对照一下时间对得上,不管If-None-Match,可以直接发回304(Not Modified)呀,很不幸,RFC2616对这种情况做了规定,如果既有If-None-Match又有If-Modified-Since,除非两者不冲突,不然不会返回304。

所以说ETag就是一个害人精,按照Yahoo的建议,别费劲想办法同步不同Server上的ETag了,干脆就把ETag删除得了(缺省,Apache和IIS都是有ETag的),我Sniff了一下Yahoo的若干网页返回HTTP Response,的确没有ETag,人家的确是知行合一;

对于Apache,在httpd.conf或者.htaccess中加一行就搞定了:

FileETag none

对于IIS 6,可就有点费劲了,首先,似乎没有办法通过Config来把ETag去掉,查了很多资料,问了很多人,似乎能够去掉ETag的办法只有写一个ISAPI Filter来弄,Sniff了一下Microsoft的几个网页的结果显示ETag都稳当当的存在,估计目前真的没有什么好方法。

只好退而取其次,保证不同Server上的ETag一致了。 IIS对Etag的计算算法是ETag = {Filetimestamp:ChangeNumber}, Filetimestamp保持一致没什么问题,ChangeNumber是metabase的change number,就有点难保证Cluster中每个Server都一样了,所以,干脆就把它设成固定值好了,这个连接告诉我们该怎么办,很可惜,没有找到彻底删除ETags的配置。
分享到:
评论

相关推荐

    缓存网页方法

    提高网站访问的性能,一般对范文用户比较多的页面进行缓存起来。

    揭秘浏览器缓存:优化网页加载的利器.zip

    浏览器缓存作为一种重要的网页性能优化技术,对于提高网页加载速度和用户体验具有重要意义。通过深入了解浏览器缓存的工作原理、类型、配置方法以及最佳实践,我们可以更好地利用缓存技术来优化网页性能。同时,通过...

    分布式缓存系统Memcached

    起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可 以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能...

    浏览器缓存技术介绍以及优化建议

    资源介绍了浏览器缓存相关信息。浏览器缓存是一种性能优化技术,它允许浏览器存储网页资源的副本,以便在后续访问时快速...正确管理浏览器缓存能够显著提高网页加载速度,减少服务器压力,并改善用户体验等。详见资源。

    浅谈HTTP 缓存的那些事儿

    由于从本地缓存读取静态资源,加快浏览器的网页加载速度是一定的,也确实的减少了数据传输,就提高网站性能来说,可能一两个用户的访问对于减小服务器的负担没有明显效果,但如果这个网站在高并发的情况下,使用缓存...

    谈谈强制缓存和协商缓存

    加快了客户端加载网页的速度 这也正是HTTP缓存属于客户端缓存的原因 强制缓存 ​ 当缓存数据库中已经有了请求的数据时,如果没有,客户端则会从服务器获取数据,如果有,客户端会直接从缓存数据库中获取数据,期间...

    IIS的内容缓存过期机制实践 有效提高站点性能

    目前,随着网页内容越来越绚烂,访问速度却令人越来越不满。实践证明,正确设置Http Response Header中的Expires头将有助于提高网页访问速度

    Fiddler之HTTP协议缓存、压缩与URL Encode

    减少了服务器的负担,大大提高了网站的性能  3.加快了客户端加载网页的速度  fiddler中查看缓存的header:  HTTP请求与响应中的Cache  判断缓存是否为最新(新鲜度):  1.浏览器把缓存文件的最后修改时间通过...

    清除浏览器缓存的几种方法总结(必看)

    浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能。但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数据。像股票类网站实时更新等,这样的网站是不要缓存的,像...

    K风网页搜索系统(.NET) v2.2 源码

    V2.2版本主要改进:改进索引系统读写性能,提高约10倍的索引速度; V2.1版本主要改进:使用.NET技术开发Web前台程序、采用UTF-8网页编码、全新索引系统、开放管理工具源代码;SP1改进:修正自动识别网页编码、改进...

    ASP.NET2.0缓存(Cache)技术深入理解

    ASP.NET2.0提供了一些新的用于提升程序性能的技术特性,其中,缓存技术是非常重要的一个特性,它提供了一种非常好的本地数据缓存机制,从而有效的提高数据访问的性能。 数据缓存(DataCaching)就是将数据暂存于内存...

    前端性能优化知识图谱指导

    JS性能优化是指在JavaScript代码的编写和执行过程中,通过一系列的优化策略和技术手段,提高代码的执行效率和性能,从而提升网页或应用程序的响应速度和用户体验。 优化JS性能的方法包括但不限于以下几个方面: 代码...

    K风网页搜索系统(.NET) v2.2.rar

    V2.2版本主要改进:改进索引系统读写性能,提高约10倍的索引速度;V2.1版本主要改进:使用.NET技术开发Web前台程序、采用UTF-8网页编码、全新索引系统、开放管理工具源代码;SP1改进:修正自动识别网页编码、改进...

    asp.net开发问题300问源码

    31.如何利用数据缓存技术提高程序的性能 33.如何实现当页面产生错误时重定向到自定义错误界面 35.如何在程序中读写Web.config文件 37.如何使用CSS文件定义控件的样式 38.如何启用和禁用ViewState保存状态信息的...

    K风网页搜索 K-PageSearch v2.2 SP5.rar

    这项技术有效提高网页信息采集的质量和检索相关度,智能自动识别、准确网页正文抽取,准确率达到95%以上。 中文分词 基于词库的智能中文分词技术,支持中英文切分、中文简繁字体转换、全角半角转换、中文姓名识别...

    浅谈django三种缓存模式的使用及注意点

    如果能将渲染后的结果放到速度更快的缓存中,每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。...

    K风网页搜索(.NET) v2.2 SP3

    V2.2版本主要改进:改进索引系统读写性能,提高约10倍的索引速度; SP2改进:修正检索组件错误引起的检索速度慢问题,大大提高检索速度; SP1改进:增加哈希值长度,基本能达到100%采集,全面爬行整站网页、增加...

    PHP缓存库phpFastCache.zip

    phpfastcache是一种高性能,分布式对象缓存系统,通用性,可用于加快动态Web应用程序,减轻数据库负载。 phpfastcache把数据库负载到几乎为零,得到更快的页面加载时间的用户,更好的资源利用率。它是简单而强大的...

    PHP网页缓存技术优点及代码实例

    Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从...

    K风网页搜索系统 K-PageSearch Engine Version v2.2 sp3.rar

    V2.2版本主要改进:改进索引系统读写性能,提高约10倍的索引速度; SP2改进:修正检索组件错误引起的检索速度慢问题,大大提高检索速度; SP1改进:增加哈希值长度,基本能达到100%采集,全面爬行整站网页、增加...

Global site tag (gtag.js) - Google Analytics