合理使用 HTTP 缓存

标签: HTTP 缓存 网络 浏览器 | 发表时间:2017-04-04 00:00 | 作者:Harttle
出处:http://harttle.com/

HTTP 缓存 使用 HTTP 缓存:Etag, Last-Modified 与 Cache-Control 一文对 HTTP 协议的缓存机制进行了简单的讨论,本文集中讨论实际操作中的最佳实践。

TL;DR

  • 谨慎地使用过期时间,最好配合 MD5 一起使用。
  • 总是启用条件请求,比如 EtagLast-Modified
  • 文件服务采用 Last-Modified,动态内容采用 Etag
  • 分离经常变化的部分,也会提高缓存的命中率。

谨慎使用过期时间

设置过期时间可以使用 Cache-Control字段也可以使用 Expires字段,前者设置有效期长度后者设置截止日期。 一旦浏览器获得这样的资源,在一定时期内服务器都无法保证资源的更新。 因此使用不当的过期时间可能导致资源的有效性和一致性问题。

有效性问题。考虑一个简单的场景: Harttle 编写了一篇工作周报,设置更新周期为一周并立即发布。 发布后很快 Harttle 便发现里面老板的名字写错了, 更新后又再次发布。 即便如此,在两次发布之间打开过该周报的同学,可能在一周内都会看到错误的版本。

一致性问题。页面的脚本文件之间可能存在依赖关系,这时如果使用 max-age 策略来缓存这些文件 可能会使整个页面不可访问,因为 max-age 无法表达依赖关系。 文件版本错乱的状况远比你想象的常见:浏览器随时可以丢弃任意一个文件的缓存、 相互依赖的文件并非总是一同载入、同一页面的资源到达时间也略有不同。

过期时间对于前端的基础库、博客页面、带MD5的资源等比较有用,尤其是 CDN 上的资源常常都有很长的过期时间。

启用条件请求

条件请求Conditional Requests)是指结果可能会被校验程序改变的 HTTP 请求。 其中 校验器(validator)通常是指缓存相关的校验程序。 条件头字段包括 If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since, If-Range。 详情可参考 使用 HTTP 缓存 一文,交互过程在 MDN Conditional Requests 也有很好的图示。

不论有无 max-age,总是应该启用条件请求。因为浏览器在刷新时就会忽略 max-age, 另外假设文件已过期,条件请求也可能减少不必要的传输。

对于静态的文件服务采用 Last-Modified 比较方便,但对于很多网站页面而言最后修改时间很难确定。 此时 Etag 更加方便,只需渲染结束后通过一次哈希来决定是否发送。 比如在 Express.jsEtag 是默认开启的,此外我们也可以做 进一步的性能优化

使用 MD5

由于过期时间独自无法解决快速更新的问题,条件请求也无法避免发送一次请求。 MD5 + 永不过期的 CDN 几乎已经成为业界常态:为每一个静态文件的文件名都增加版本号(或 MD5 值), 每次更新文件都同时更新版本号,每个文件都在 Cache-Control设为永不过期, 同时 HTML 等入口文件的 Cache-Control 则设为禁止缓存。

标准上讲,使用 URL 的 search 字符串作为文件版本号是完全等价的,这样文件名都无需改变。 这一 Trick 在 Github Badges 中很常见。但是在实践中,网络运营商和 CDN 提供商不一定会理会 search 字符串。

增加版本号这一操作(成为 revision)通常在发布过程中进行,与压缩混淆一起。 主流的构建工具均已支持:

分离变化的部分

按照现在的节奏,一个互联网应用几乎每天都会有更新。 那么对于一个使用频次较高的网站,将所有静态文件(比如 JavaScript 脚本)打包在一起会让缓存整体失效。 在这种情况下分离的缓存会更加有效。比如:

  • 把经常变化的业务逻辑抽离,单独缓存。
  • 基础工具库独立打包并缓存。

相关 [合理使用 http 缓存] 推荐:

合理使用 HTTP 缓存

- - Harttle Land
HTTP 缓存 使用 HTTP 缓存:Etag, Last-Modified 与 Cache-Control 一文对 HTTP 协议的缓存机制进行了简单的讨论,本文集中讨论实际操作中的最佳实践. 谨慎地使用过期时间,最好配合 MD5 一起使用. Last-Modified,动态内容采用. 分离经常变化的部分,也会提高缓存的命中率.

HTTP缓存算法

- - PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间
HTTP协议缓存的目标是去除许多情况下对于发送请求的需求和去除许多情况下发送完整请求的需求. 以不发送请求或减少请求传输的数据量来优化整个HTTP架构,此目标的实现可以产生如下好处:. 降低对原始服务器的请求量. 减少了传送距离,降低了因为距离而产生的时延. 缓存基本处理过程包括七个步骤. 接收 – 缓存从网络中读取抵达的请求报文.

http协议:Web前端-HTTP Cache-control/浏览器缓存(转)

- - 互联网 - ITeye博客
HTTP协议分别在 1.0 / 1.1 两个时代推出了 Expires / Cache-control 两种cache策略,这里我们无需了解全部的细节,无需记住整个RFC内容,但是当我们需要使用HTTP cache策略时,我们需要注意以下细节:. Expires 是HTTP 1.0 那个时代的东西了,目前来看,可以不使用了,因为HTTP 1.0 的user agent占有率在 0.1% 以下(我们主要面向的web浏览器均默认使用HTTP 1.1),Cache-control 是 HTTP 1.1 的新特性,也是我们主要做文章使用cache策略的工具.

浅析http协议与缓存

- - 博客园_Ruby's Louvre
最近几天在复习http协议中headers,缓存等相关知识,发现些新知识点. 这篇文章注重结合PHP去理解这些内容,也就是比较注重实践部分. 一、http headers. NO1:对于web应用,用户群在客户端 (各种浏览器)点击任何一个连接向服务器发送http请求,这过程肯定需要3次握手,建立连接,服务器响应返回数据.

JBoss_053:使用JDG外部缓存HTTP Session

- - 热爱Java ,热爱生活
环境:JBoss EAP 6.4.0 + JBoss Data Grid 6.5.0. JBoss Data Grid 6.5.0 有个新特性:可以把JDG 作为外部缓存来存储HTTP Session,这样做的好处是:. (1)减轻了应用服务器的内存压力以及集群节点间的 Session 复制. (2)利用JDG的横向扩展能力,可以容纳更多的 Session 对象.

web基础-web工作原理,http协议,浏览器缓存

- - 浏览器 - 互联网 - ITeye博客
4,cookie和session. 平时用浏览器,输入网址后回车,页面响应我们想要浏览的内容,简单操作的背后蕴涵了什么原理. 当输入url回车后,客户端(浏览器)会去请求DNS服务器,通过DNS获取域名对应的IP地址,然后通过这个地址找到对应的服务器,要求建立TCP连接,建立连接,客户端发送httpRequest(请求包)后,服务器接收并开始处理请求,调用自身服务,返回httpResponse(响应包),客户端收到响应包后开始渲染body主体,等到全部接收,断开与该服务器端的TCP连接.

聊聊高并发系统之HTTP缓存(转)

- - 企业架构 - ITeye博客
原文网址:http://jinnianshilongnian.iteye.com/blog/2319573. 最近遇到很多人来咨询我关于浏览器缓存的一些问题,而这些问题都是类似的,因此总结本文来解答以后遇到类似问题的朋友. 因本文主要以浏览器缓存场景介绍,所以非浏览器场景下的一些用法本文不会介绍,而且本文以chrome为测试浏览器.

[转][转]浅析http协议、cookies和session机制、浏览器缓存

- - heiyeluren的Blog
来源:http://www.phpben.com/?post=77. 最近几天在复习http协议中headers,cookies、session、缓存等相关知识,发现些新知识点. 这篇文章注重结合PHP去理解这些内容,也就是比较注重实践部分. 一、            http headers          .

基于HTTP缓存轻松实现客户端应用的离线支持及网络优化

- - Oasis Feng
常规的客户端应用开发实践中,为了支持离线特性,往往需要引入本地数据存储并增加相应的『离线状态』逻辑分支. 本地存储的大量使用对数据结构的前后向兼容设计提出了很高的要求,一旦考虑不足,往往不得不引入复杂的版本间数据升降级处理,进一步加剧开发和维护成本. 而且针对『离线』与『在线』状态这两条并行的处理分支,对业务逻辑的清晰性和可维护性有一定的破坏,常常容易在后续开发中造成处理遗漏,给测试和维护带来更多的痛苦.

HTTP Headers 入门

- johnny - Time Machine
非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此. 本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记. 什么是HTTP Headers. HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章.