fanyer

Code, Design, and Things in Between


Just Help Yourself

caches

缓存实践

对于各种HTTP缓存控制头部的对比以及用户可能出现的浏览器刷新行为,当我们在一个项目上做http缓存的应用时,我们实际上还是会把可能的大多数首部字段均使用上。

1. Expires / Cache-Control

Expires用时刻来标识失效时间,不免收到时间同步的影响,而Cache-Control使用时间间隔很好的解决了这个问题。 但是 Cache-Control 是 HTTP1.1 才有的,不适用于 HTTP1.0,而 Expires 既适用于 HTTP1.0,也适用于 HTTP1.1,所以说在大多数情况下同时发送这两个头会是一个更好的选择,当客户端两种头都能解析的时候,会优先使用 Cache-Control。

2. Last-Modified / ETag

二者都是通过某个标识值来请求资源, 如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed)状态码,内容为空,这样就节省了传输数据量。而当资源发生比那话后,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

其中Last-Modified使用文件最后修改作为文件标识值,它无法处理文件一秒内多次修改的情况,而且只要文件修改了哪怕文件实质内容没有修改,也会重新返回资源内容;ETag作为“被请求变量的实体值”,其完全可以解决Last-Modified头部的问题,但是其计算过程需要耗费服务器资源。

3. from-cache / 304

Expires和Cache-Control都有一个问题就是服务端作为的修改,如果还在缓存时效里,那么客户端是不会去请求服务端资源的(非刷新),这就存在一个资源版本不符的问题,而强制刷新一定会发起HTTP请求并返回资源内容,无论该内容在这段时间内是否修改过;而Last-Modified和Etag每次请求资源都会发起请求,哪怕是很久都不会有修改的资源,都至少有一次请求响应的消耗。

对于所有可缓存资源,指定一个Expires或Cache-Control max-age以及一个Last-Modified或ETag至关重要。同时使用前者和后者可以很好的相互适应。

前者不需要每次都发起一次请求来校验资源时效性,后者保证当资源未出现修改的时候不需要重新发送该资源。而在用户的不同刷新页面行为中,二者的结合也能很好的利用HTTP缓存控制特性,无论是在地址栏输入URI然后输入回车进行访问,还是点击刷新按钮,浏览器都能充分利用缓存内容,避免进行不必要的请求与数据传输。

最近的文章

Canvas Profile

继续阅读
更早的文章

calm down Under anxiety

anxiety diary我本身有一点心率不齐(高考体测得)有些很多未补完的事情,一旦即将deadline, 都会本能地有难以遏制地anxiety。而从前不以为意的items也会一起burst出来, 如果是在家的闲余时间,我会将其转为身体运动来暂时性放逐精神,以免思绪乱飞,譬如弹n个小时的钢琴,或是大学时期的大学城内环4km跑步。身体的运动有抚慰精神的效果。如果是在worktime, 则会开始写文档或是日志, 其实也是一部分的身体movements来comfort自己的精神。这两种办法其实...…

继续阅读