Login

新增缓存机制 - HTTP Caching

2008-06-18 23:04:52 by kommit

上次提到的 theme 机制带来的性能下降,这两天我折腾了一下,期待有所改善:

在处理 theme 相关的文件(css/image)的请求的时候,在 Response-Header 中加上这几项:


Last-Modified: Wed, 18 Jun 2008 14:22:27 GMT
Cache-Control: max-age=600
Expires: Wed, 18 Jun 2008 14:48:39 GMT
Date: Wed, 18 Jun 2008 14:38:39 GMT


其中 Last-Modified 后面的日期是上次更新 config 的时间,Date 后面是当前时间,Expires 后面是当前时间 + 10分钟,10分钟就是 Cache-Control 后面的 max-age,单位是秒。因为看到 GAE 对 static 文件的 Cache 时间也是10分钟,所以我使用了这个数字。

Last-Modified

如果客户端收到的 Response 中包含 Last-Modified,那么下次 request 的时候就会在 Request Header 中包含 If-Modified-Since 字段,值就是上次服务器发送的 Last-Modified,服务器端会判断上次的 config 时间是否比 If-Modified-Since 晚。如果自上次 request 之后又更新了 config,那么服务器就会返回完整的内容;如果期间没有更新 config,那么服务器就没必要返回完整的内容,只需要向客户端发送一个 304 Not Modified 状态码就可以了。

Cache-Control、Date 和 Expires

这几个参数的组合,表示告诉浏览器:这个文件在多长时间之内不会更改,在这个时间内不需要再 request,保守起见,我设置了10分钟。

浏览器行为

如果只是在网站的链接之间 click click click,那么浏览器会完全遵守上述行为。这样可以尽可能地减少请求次数,以及 response 的数据量。

如果在某个页面点击了浏览器的刷新按钮或者按 F5,浏览器会忽略 Expires 时间,把该页面需要的所有的文件都重新请求一遍。

如果按住 Ctrl 再刷新或者 Ctrl-F5 (俗称强制刷新),浏览器将不会发送 Last-Modified Header,将所有需要的文件请求一遍,服务器会返回文件的完整内容,而不是仅仅一个 304 Not Modified 状态码。

后记

经初步观察,现在浏览器不会每次都彪呼呼地去请求一大堆 css、jpg、gif 文件了,浏览器也不会每次都脑残地返回完整内容了,看来是有效了。

之前没怎么研究过 HTTP 协议,上面这些都是这两天通过抓包分析得出来的结论,然后参考了一下 django 的代码。不知道有没有不对的地方,欢迎大家指正。。。

另外有朋友建议我使用 MemCache API 来减少服务器端的计算量,这个我确实正在考虑。而且理论上确实可以提高效率。

在 GAE 提供的有限的资源上折腾,真是一件有意思的事情。

Tags: caching, performance, plog, http, dev

Comments:

如果碰到Opera这种浏览器,不管你怎么F5或Ctrl+F5,想要它刷新一次都很难。

2008-06-18 23:41:09 by 野鸭

用你的程序架了个BLOG,非常感谢!

2008-06-20 12:41:35 by Homyu.Shinn

我用了你的plog,谢谢。

comments如果可以匿名,是不是更好?

2008-06-22 12:15:22 by eskimo

to eskimo:
你可以更改你的 nick 来让别人看不到你的真实 id,不过 blog 的 admin 还是可以看到的。
但是现在还不支持非登陆用户的 comment,可以考虑在设置界面里面加个开关,用来开启或者关闭匿名 comment 的功能。

2008-06-22 19:56:23 by 小七

ceshi

2008-07-02 17:33:00 by flyinweb

You can leave a comment on this post if you login