优化缓存

分类:性能优化_架构设计| 发布:camnprbubuol| 查看: | 发表时间:2011/6/23


大多数的网页包括诸如CSS文件,图像文件,JavaScript文件等资源,改变很少。这些资源需要一段时间才能通过网络下载,这增加了花费的时间来加载网页。HTTP缓存使这些资源得以保存,或通过浏览器缓存或代理。一旦资源被缓存,浏览器或代理可以参考本地缓存的副本,而无需下载到网页以后访问一遍。因此,缓存是一种双赢:你减少 往返时间 ,消除众多的HTTP请求所需的资源,并大大降低了你的反应总有效载荷的大小。除了 ​​导致在随后的页面加载时间大幅降低用户访问,使缓存还可以显着降低带宽和托管费用为您的网站。

  1. 利用浏览器缓存
  2. 利用代理缓存

利用浏览器缓存

概述

设定到期日或静态资源的HTTP头的最高年龄指示浏览器加载,而不是通过网络本地磁盘先前下载的资源。

详情

HTTP / S支持本地浏览器的静态资源缓存。最新的浏览器的一些(如IE 7,镀铬)使用启发式决定多久缓存中的所有资源,没有明确的缓存头。其他较旧的浏览器可能会要求设置缓存头,才会从缓存中获取资源,有的可能永远不会缓存通过SSL发送的任何资源。 

要利用在所有浏览器的缓存一致的全部好处,我们建议您配置Web服务器显式设置缓存头,并将其应用到所有 可缓存静态资源,不只是一小部分(如图像)。可高速缓存的资源包括JS和CSS文件,图像文件和其它二进制目标文件(媒体文件,PDF,Flash文件,等等)。一般来说,HTML不是一成不变的,而不应被视为缓存。 

HTTP/1.1提供了以下缓存响应头:

  • 过期缓存控制:最大年龄这些指定的资源“保鲜寿命”,也就是在这一段时间内可以使用的浏览器不检查,看看是否有新的版本是从Web服务器上可用的缓存资源。他们是“强缓存头”适用于无条件的,也就是说,一旦它们设置和资源下载,浏览器不会发出任何对资源的GET请求,直到到期日或最高年龄达到。
  • 上次修改ETag的这些指定一些关于资源的特点,浏览器检查,以确定该文件是相同的。最后修饰 头,这始终是一个日期。ETag的头,这可以是任何值,唯一标识一个资源(文件版本或内容哈希典型值)。上次修改是一个“弱”在缓存头,浏览器应用了启发式,以确定是否需要获取该项目从缓存与否。(之间的启发式是不同的浏览器不同。)然而,这些头让浏览器能够有效地更新发行条件GET请求时,用户明确地重新加载页面的缓存资源。有条件的GETs不返回资源的充分反应,除非在服务器上发生了变化,因而具有较低的延迟比完全得到。

重要的是要指定一个过期 或缓存控制最大年龄, 一个最后修饰 或ETag的所有缓存资源。它是多余的同时指定过期 和缓存控制:最大年龄,或同时指定上次修改 和ETag的。 

建议

设置缓存所有静态资源头积极。
对于所有可缓存的资源,我们推荐以下设置:
  • 设置过期 至一个月最低,最好长达一年,在未来的。(我们喜欢过期超过缓存控制:最大年龄,因为它是更广泛的支持)不要将它在未来一年多,因为这违反了RFC准则。

    如果你知道什么时候资源都不会改变,设置较短的到期是好的。但如果你认为它“可能会很快改变”,但不知道什么时候,你应该设置一个长URL过期和使用指纹(如下所述)。设置缓存积极不“污染”浏览器缓存:据我们所知,所有的浏览器清除其高速缓存根据最近最少使用的算法,我们不是任何浏览器,等待他们的资源清除前到期知道。

  • 设置上次修改日期,最后一次资源被改变。如果 上次修改日期是远远不够充分,在过去,很可能是浏览器不会重新提取它。
使用指纹来动态启用缓存。
对于资源的变化有时,你可以让浏览器缓存的资源,直到它改变在服务器上,而此时服务器告诉浏览器,一个新的版本可用。你完成了嵌入的资源在其网址的指纹(即文件路径)这一点。当资源的变化,所以不其指纹,并反过来也是如此它的URL。只要URL变化,浏览器被迫重新获取资源。指纹可以设置到今后相当长的资源,甚至比这更频繁地改变届满的日期。当然,这种技术需要的页面引用该资源有关的指纹网址,它可能是也可能不是可行,如何根据您的网页编码都知道。
设置为Internet Explorer Vary头正确。
Internet Explorer不缓存任何与该服务资源 因人而异头和任何领域,但接受编码 和用户代理为了确保这些资源被IE缓存,一定要剥离出Vary头从任何其他领域,或删除Vary头完全可能的话
避免在Firefox的网址,导致缓存冲突。
Firefox的磁盘高速缓存散列函数可以生成不同的URL只是轻微碰撞,即只对8个字符的边界。当资源散列相同的密钥,只有资源之一,是保存到磁盘高速缓存,具有相同的键的剩余资源,必须在浏览器重新启动再牵强。因此,如果你正在使用指纹或以其他方式编程方式生成文件的网址,最大限度地缓存命中率,避免通过确保您的应用程序生成的URL就超过8个字符的边界不同的Firefox哈希冲突的问题。
使用高速缓存控制:公共 指令,启用HTTPS的Firefox缓存。
Firefox的一些版本要求的  高速缓存控制:公共 头是在通过SSL发送给在磁盘上缓存资源的顺序设置,即使其他缓存头显式设置。虽然这头通常用于启用(如下所述)代理服务器的高速缓存,代理服务器无法缓存通过HTTPS发送的任何内容,因此它始终是安全设置此为HTTPS资源头。

示例

对于用来显示用户的登录后日历样式,谷歌日历嵌入在其文件名 ​​的指纹:日历/静态/ fingerprint_key doozercompiled.css,其中指纹密钥是一个128位的十六进制数。在屏幕的下方拍摄时间(从网页速度的拍摄显示资源面板),指纹被设置为82b6bc440914c01297b99b4bca641a5d:

该指纹识别机制允许服务器设置过期头正好提前一年的申请之日起,在上次修改 的日期标头文件的最后修改;和缓存控制:最大年龄头3153600。为了使客户端重新下载文件的情况下它的到期日或之前最高年龄的变化,指纹(因此URL)的变化时该文件的内容一样。

其他资源

返回顶部

利用代理缓存

概述

在启用静态资源的公共HTTP标头缓存允许浏览器下载从附近的代理服务器资源从远程服务器,而不是产地。

详情

除了浏览器缓存,HTTP提供了代理缓存,使静态的资源,在公共网络代理服务器,尤其是通过互联网服务供应商所使用的缓存。这意味着,即使是第一次到您的网站用户可以受益于缓存:一旦静态资源已被要求通过一个代理用户,该资源为所有的请求通过代理去同其他用户使用。由于这些地点可能在附近比你更接近网络服务器的用户,代理缓存可能导致网络延迟显着减少。另外,如果启用代理缓存有效地为您提供免费网站托管,因为从代理缓存服务响应不上你的服务器的带宽得出的。

您可以使用高速缓存控制:公共 头,表示一个资源可以通过公共网络代理缓存,除了浏览器发出的请求。除了 ​​某些例外(如下所述),你应该配置Web服务器来设置这个头以公众为可缓存的资源。

建议

不包括在静态资源的URL查询字符串。
大多数代理,最显着的鱿鱼,通过3.0版了,不缓存与资源“?” 在他们的网址即使缓存控制:公共头在响应中。为了使这些资源代理缓存,删除静态资源引用查询字符串,而不是编码到文件名 ​​称本身的参数。
不要启用资源,设置cookie代理缓存。
设置标题公众有效地在多个用户之间共享资源,这意味着对于这些资源设置任何饼干也是共享的。虽然许多代理实际上不会缓存,cookie设置标题的任何资源,最好完全避免风险。无论是设置缓存控制私人或为这些资源 从Cookie的域
是用JS和CSS文件代理缓存的问题知道的。
一些公共代理有错误,不检测存在 内容编码响应头。这可能会导致传递到客户端浏览器无法正常解压缩文件的压缩版本。由于这些文件应始终 gzip压缩 您的服务器,以确保客户能够正确读取文件,执行下列操作之一:
  • 设置的缓存控制标头私人这将禁用代理缓存总共为这些资源。如果您的应用程序是多宿主业务遍布全球,依靠当地代理缓存用户较少,这可能是一个适当的设置。
  • 设置各不相同:接受编码 响应头。这将指示代理缓存两个版本的资源:一是压缩,和一个压缩。资源的正确版本提供基于客户请求头。这是一个是单穴和依靠当地公众用户代理应用的理想选择。

原文地址:http://code.google.com/intl/zh-CN/speed/page-speed/docs/caching.html#LeverageBrowserCaching
365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/archives/365.html