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

HTTP Caching 优化网站

阅读更多

原文出处:http://blog.chenlb.com/2009/07/http-caching-optimize-your-site.html

HTTP Caching 用好了,可以极大的减小服务器负载和减少网络带宽。十分有必要深入了解下 http 的 caching 协议。

先来看下请求/响应过程:

http 请求/响应

http 请求/响应

1、用 Last-Modified 头

在第一次请求的响应头返回 Last-Modified 内容,时间格式如:Wed, 22 Jul 2009 07:08:07 GMT。是零时区的 GMT 时间,servlet 中可以用 response.addDateHeader("Last-Modified", date.getTime()); 加入响应头。如图:

last-modified 和 If-Modified-Since

last-modified 和 If-Modified-Since

Last-Modified 与 If-Modified-Since 对应的,前者是响应头,后者是请求头。服务器要处理 If-Modified-Since 请求头与Last-Modified 对比看是否有更新,如果没有更新就返回 304 响应,否则按正常请求处理。如果要在动态内容中使用它们,那就要程序来处理了。

ps:servlet 取 If-Modified-Since 可以用 long last = requst.getDateHeader("If-Modified-Since");

2、用 Etag 头

很多时间可能不能用时间来确定内容是否有更新。那可以用 Etag 头,etag 是以内容计算一个标识。计算的方式可以自己决定,比如可以用 crc32、md5等。

Etag 和 If-None-Match

Etag 和 If-None-Match

Etag 与 If-None-Match 是对应的,前者是响应头,后者是请求头。服务器要判断请求内容计算得到的 etag 是否与请求头 If-None-Match 是否一致,如果一致就表示没有更新,返回304就可,否则按正常请求处理。可以参考:用 HttpServletResponseWrapper 实现 Etag 过滤器

3、用 Expires 头,过期时间

当请求的内容有 Expires 头的时候,浏览器会在这个时间内不去下载这个请求的内容(这个行为对 F5 或 Ctrl+F2 无效,用 IE7,Firefox 3.5 试了,有效的比如:在地址输入后回车)。

expires 过期时间

expires 过期时间

在 servlet 中可以用 response.addDateHeader("Expires", date.getTime()); 添加过期内容。

ps:在 httpwatch 中可以看到 Result 为 (Cached) 状态的。

4、用 max-age 的 Cache-Control 头

max-age 的值表示,多少秒后失效,在失效之前,浏览器不会去下载请求的内容(当然,这个行为对 F5 或 Ctrl+F2 无效)。比如:服务器写 max-age 响应:response.addHeader("Cache-Control", "max-age=10");

ps:如果你还要加一些 Cache-Control 的内容,比如:private,最好不要写两个 addHeader,而是一个 response.addHeader("Cache-Control", "private, max-age=10"); 否则 ie 可能对 max-age 无效,原因它只读第一个 Cache-Control 头。

小结:

Last-Modified 与 Etag 头(即是方式1和2)还是要请求服务器的,只是仅返回 304  头,不返回内容。所以浏览怎么 F5 ,304 都是有效的。但用 Ctrl+F5 是全新请求的(这是浏览器行为,不发送缓存相关的头)。

Expires 头与 max-age 缓存是不需要请求服务器的,直接从本地缓存中取。但 F5 会忽视缓存(所以使用 httpwatch 之类的 http 协议监察工具时,不要 F5 误认为 Expires 和 max-age 是无效的)。

http 协议监察工具:

Firebox:httpfox、live http header

IE:httpwatch、iehttpheader

 

分享到:
评论
1 楼 zhang_huihua 2011-10-30  
浏览器客户端缓存确实非常重要,但好像绝大多数开发人员都只注重服务器端缓存,而忽略了客户端缓存

相关推荐

    Enyim.Caching 2.4

    Enyim.Caching 是一个针对 .NET Framework 开发的高效 Memcached 客户端库,其版本 2.4 提供了对 Memcached 服务的全面支持和优化。Memcached 是一款广泛使用的分布式内存对象缓存系统,常用于减轻数据库负载,提高...

    ASP.NET 2.0 Caching

    这对于优化缓存策略非常重要。 示例配置: ```xml , Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <httpCaching> *"/> </httpCaching> ``` #### 七、总结 ...

    Memcache客户端Enyim.Caching 参考的例子

    EnyimMemcached-18030是Enyim.Caching的一个特定版本,可能是由社区成员进行了一些修改和优化,以适应.NET 2.0和3.5框架。这个版本可能包含了性能提升、bug修复或其他特性改进,具体变更需要查看该版本的源代码或...

    memcached-win32-1.4.4-14+Enyim.Caching.2.12

    6. **性能优化**:了解和实践最佳实践,例如合理设置缓存过期时间,使用合适的序列化方式,以及监控和调整memcached的性能指标。 7. **故障处理与扩展**:学习如何处理连接问题,以及在多节点环境中如何实现故障...

    Entity Framework SQL Tracing and Caching Provider Wrappers

    总的来说,"Entity Framework SQL Tracing and Caching Provider Wrappers" 是一个强大的辅助工具,它可以帮助开发者深入理解EF的行为,优化SQL查询,以及有效利用缓存机制提升应用性能。通过利用这个工具,开发者...

    hibernate caching

    ### Hibernate Caching 知识点详解 #### 一、什么是缓存(Caching) 缓存是一种优化数据库应用程序的技术,它的设计目的是减少应用与数据库之间的通信流量,通过存储已经从数据库加载的数据来实现这一目标。当从...

    web caching

    ### Web Caching:关键技术与应用 #### 一、引言 随着互联网的迅猛发展,特别是自1993年以来世界万维网(World Wide Web,简称WWW)的普及与使用量急剧增加,网络负载和用户响应时间面临了前所未有的挑战。这种...

    A web caching primer

    1. **商业网站**:大型电子商务网站经常使用Web缓存来优化用户体验,尤其是在高峰期能够快速响应大量并发请求。 2. **视频流媒体平台**:对于视频流媒体服务而言,CDN技术尤其重要。它可以确保视频内容在世界各地都...

    java caching system完整项目例子(包括用到的JAR包)

    2. `commons-collections.jar`: Apache Commons Collections库,提供了一些高级数据结构和集合操作,JCS可能用到了其中的一些数据结构来优化缓存管理。 3. `commons-lang.jar`: Apache Commons Lang库,提供了一系列...

    Distributed Caching with Memcached

    尽管Memcached对应用是中立的,但它在提高高流量网站性能方面表现尤为突出,如LiveJournal、Slashdot、Wikipedia等知名网站都在使用它。 动机与背景 在过去的八年里,开发大型、交互式的数据库支持的Web站点已经...

    A Refreshing Perspective of Search Engine Caching

    文章的标签为"Search Engine Caching",表明了其专注于搜索引擎缓存领域。 在讨论搜索引擎缓存的新算法时,该算法主要解决了缓存失效的问题,这是因为互联网内容更新迅速,如果搜索引擎的缓存信息长时间不更新,就...

    前端开源库-caching-coffeeify

    "caching-coffeeify"就是这样一个专为前端开发者设计的开源库,它旨在优化咖啡脚本(CoffeeScript)的编译过程。本文将详细探讨这个库的功能、原理以及如何在项目中使用它。 首先,让我们了解一下咖啡脚本...

    【Java 设计模式-源码】Caching 模式:加速数据访问速度

    在 Java 开发中,Caching 模式是一种重要的性能优化和资源管理模式。它涉及各种缓存策略,如写通、读通和 LRU 缓存,以确保高效的数据访问。Caching 模式通过避免在使用后立即释放资源,而是将其保留在快速访问存储...

    The Slab Allocator An Object-Caching Kernel Memory Allocator

    这不仅优化了内存访问性能,也改善了系统的总线负载均衡。 #### 性能对比 通过对Slab Allocator与其他几种知名的内核内存分配器进行比较,结果显示,无论是在空间还是时间性能方面,Slab Allocator都表现出了优越...

    Adaptive Insertion Policies for High Performance Caching

    ### 适应性插入策略在高性能缓存中的应用 #### 概述 《Adaptive Insertion Policies for High Performance Caching》是一篇深入...该研究为优化缓存管理提供了一个新的视角,并为进一步探索缓存优化策略奠定了基础。

    Caching HTTP Headers, Last-Modified and ETag

    标题 "Caching HTTP Headers, Last-Modified 和 ETag" 涉及到的是网络缓存中的两个关键概念,它们在优化网站性能、减少服务器负载以及提高用户体验方面扮演着重要角色。HTTP缓存机制允许浏览器存储先前请求过的资源...

    performance of compressed inverted list caching

    为了应对这种高负载的需求,搜索引擎采用了一系列优化技术,其中包括索引压缩、缓存机制以及早期终止策略等。 本文主要关注两个重要的技术:倒排索引压缩和索引缓存。这两项技术在提高搜索引擎及其他高性能信息检索...

    cache_common.rar_caching

    在IT领域,缓存(Caching)是一种优化技术,用于提高数据访问速度和系统性能。在给定的“cache_common.rar_caching”压缩包中,我们关注的核心是“ld.so directory caching”,这是一个与动态链接器(Dynamic Linker...

    netfs.rar_caching

    本文将深入探讨"netfs.rar_caching"这一主题,它涉及到在网络文件系统中实现缓存机制的过程。 首先,让我们理解什么是缓存(Caching)。缓存是一种在高速存储器中临时保存数据的技术,以减少对较慢存储设备(如硬盘...

    Ajaxifying, Caching and Pipelining Facebook Website

    Facebook在其网站上采用了一系列优化技术,包括Ajaxifying、Caching和Pipelining,以提升用户体验,尤其是网页加载速度。这些技术对于一个拥有5亿用户的大型社交平台来说至关重要,因为网站速度直接影响到用户的参与...

Global site tag (gtag.js) - Google Analytics