Chen Yangjian's Blog

Carpe diem - Seize the day

缓存控制

| Comments

最近在看一个《手把手教你在 Google App Engine Python 版上开发博客》,之前一篇博文中也提到了。开篇第一章,说到缓存控制。

需要考虑到的差不多就两种:静态文件,在客户端呆多久都行,其一;存储在数据中的大段数据,或者动态生成的其他内容,图片、压缩包等等,其二。参考 Yahoo 的最佳实践,对静态文件需要做的就是尽量减少 HTTP 请求数,弄些 Sprites、Gzip 掉数据,并在返回数据的时候在表头里加上 Expires 或者 Cache-Control。如:

Expires: Thu, 15 Apr 2010 20:00:00 GMT
Cache-Control: max-age=220752000; must-revalidate

格林尼治时间,max-age 的单位是毫秒。后边这个 must-revalidate 用来处理网站还在频繁更新、动态数据的情况。让浏览器请求数据时先向服务器确认数据有没有更新。校验的方式有两种:If-Modified-Since (HTTP 1.0)和 If-None-Match (HTTP 1.1)。如果确认数据没有变动,便会返回一个 HTTP 304。

服务器返回表头示例:

Last-Modified: Thu, 15 Apr 2009 20:00:00 GMT
Etag: "3e86-410-3596fbbc"

浏览器处理的时候就会记住这些,下次请求是,便把这些数据丢回服务器,看看有没有变动:

If-Modified-Since: Thu, 15 Apr 2009 20:00:00 GMT
If-None-Match: "3e86-410-3596fbbc"

如果变更日期较大(HTTP 1.0),Etag(Entity Tag,HTTP 1.1)不匹配,服务器就不再返回 304,而是返回 200 以及更新后的数据。

效果如何,可以参考 Yahoo 的一篇实践测试,也可以试用鹿木;具体在 App Engine 里头如何做,使用自带的 webapp 框架的话,可以看文首提到的教程,用 django 的话,可以看在下的(serve 函数便是了)……

Comments