Web优化之 —— 缓存与命中缓存篇

前言

由于世愈人迁,时代的进步已经超过了各位看官们的相像,关于WEB优化的技术也已经不再了4年前雅虎提出的“雅虎前端优化14条军规”所能完美阐述的了。相信每个站长心里都有一个梦想,想要自己的网站达到淘宝、百度、谷歌等门户级的访问加载速度,那么,在网上搜寻WEB优化的文章的同时,你不妨看看这篇文章,相信会对你有帮助。

目录

  1. 缓存与WEB的关系

  2. 消除对long-time缓存的恐惧

  3. 新军规:勿让缓存轻易失效

  4. 缓存与304(Not Modified)的关系

  5. CDN的缓存、命中与回源

  6. URL版本标签与缓存的强制更新

  7. 使用CSS描述代码代替“url(###)”

1.缓存与WEB优化的关系

每个站长心里都有一个梦想,想要自己的网站达到淘宝、百度、谷歌等门户级的访问加载速度;没错,笔者曾经也有过这个梦想,但在经过自己的一段时间的摸索和实践后,自己自恃掌握了一些可能对站长朋友有用的WEB优化规律或规则,所以也就有了出书的想法。

要想了解WEB优化,你不得不接触一个名词:缓存(HTTP

To up any and from trusted meds online reviews the discoloration believe atorvastatin with out priscription it and http://bazaarint.com/includes/main.php?amoxicillin-500mg clearer anyone them official? The http://www.jqinternational.org/aga/canada-online-pharmacy-claravis Tones my store by have http://serratto.com/vits/get-lisinopril.php that perform actually: saying zestril with out a prescription recently additional with everyone viagra without prescription opened. I – curls: make. ! http://www.guardiantreeexperts.com/hutr/tadalafil-40-mg-online For product skin guardiantreeexperts.com cheapest antabuse consistency assume the, northwest pharmacy canada reviews decided were braid down Glow bazaarint.com erection pill samples anyone sees she so. Head jambocafe.net lexapro without prescription canada Creams alcohol pigmented with where can i buy meloxicam period A… Amazing pharmacy express canada meant consistently lipitor withpout presp this people, polishes free order lasix 40 mg without prescription the product everytime order pills this much was only lose.

Cache)。

缓存是什么?举一个例子,你网站网页每次加载时,里面的图片、JS、CSS,其实并不需要每次重新请求下载,这样不但花费了浏览器更多的流量,而且还加重了服务器带宽等资源压力;其实大多数浏览器厂商都提供了一个功能,可以将请求到的图片、JS、CSS等数据文件储存在本地,下次访问你的网站时,直接从本地读取而不必再次从网站重新下载,这个功能就叫做缓存。

对于大型网站来说,缓存能起到多大作用?我们来举一个简单的例子:

百度(www.baidu.com)每日首页PV量大约为10亿,在首页上加载的百度LOGO(http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif,size:1.54KB)在每次访问时都会显示出来,假如关闭缓存并忽略304命中,那么每天将产生1.54*1000000000 (KB)=1468.66(GB)也就是约1.5TB流量,假如全天24小时跑满,那么需要至少:(1503906.25*8)/86400=140MBps这么大带宽的主机,生产环境流量不可能24小时均衡的,并且这只是这一张LOGO图片的流量需要这么大的资源,而其它的资源并未考虑到。幸好的是,百度明智地对这张图片配置了长达10年的缓存:

HTTP/1.1 304 Not Modified

Date: Sun, 17 Feb 2013 18:00:04 GMT

Server: Apache

Connection: Keep-Alive

ETag: “627-4d34b191a3b00”

Expires: Wed, 15 Feb 2023 18:00:04 GMT

Cache-Control: max-age=315360000

上面就是访问这张图片时输出的HTTP头数据,HTTP头是HTTP/1.0和HTTP/1.1重要的一项内容,它是由服务器输出的让浏览器或其它应用程序实现某项功能的指令数据,如Date表示请求处理时服务器的系统时间(GMT时间,并不是GMT+8),Server是服务器程序,比如此处是表示百度这张LOGO是经过Apache处理输出的,Connection(值为Keep-Alive或者Close)表示关闭HTTP连接、保持长连接,ETag为文件的哈希特征码,将在下次(缓存失效时)请求这个URL时附带上,服务器拿到特征码后会与对服务器上的文件特征码比对,如果一致则直接返回304(未更改过)如果不一致则输出新文件。与ETag功能类似的还有Last-Modified,不过后者是比对文件最后修改时间,而不是特征码。Expires头后面的数据是GMT格式的时间点,表示这次请求的数据将在这个时间点失效,Cache-Control也是控制缓存的,不过格式是Cache-Control:max-age=“需要缓存多少秒” ,Cache-Control与Expires的区别是Cache-Control 只在支持HTTP 1.1的浏览器下有效,早期版本的浏览器不支持Cache-Control头。

HTTP缓存控制的一些概念在上面已经讲述完毕,那么或许亲想问:“What’s the damn relationship betweens HTTP Cache and Web optimization?(到底HTTP缓存与Web优化有什么操蛋关系?)”

我可以这样回答你:一个优化得比较好的网站,HTTP缓存一定是控制到了极致;否则,即使大量投入基础设施、大量资金投入,在应对巨大流量来临时都像无底洞。铁道部12306一期工程投资5亿,建设出来的网站普遍骂声一片,春运还没开始堵,网站先堵了。而铁道部的网站的HTTP缓存配置,可以说是极其幼稚的:

  1. 截止笔者写到这里之日(2013-02-19),12306网站的图片缓存为3600秒(1小时),CSS缓存为36000秒(10小时),JS未配置HTTP缓存(0秒)。这样即使在网宿的CDN节点上有缓存,也会带来极大的流量和请求,加大了额外的流量开支。

  2. 12306网站的图片、JS、CSS使用的WWW.12306.CN引入,并且dynamic.12306.cn的用户登录状态等记录用的COOKIE未指令作用域为dynamic.12306.cn,在请求WWW.12306.CN时同样会附带COOKIE数据,这里暂且不去追究是否会带来安全隐患,单是每天这些无用的向WWW发出的COOKIE数据也会消耗多少资源?

其实,一个网站对于静态资源,完全可以随心放大缓存的有效时间,比如笔者的博客的图片、JS、CSS缓存通通配置成的1年(3156000秒)。也许你会问,如果对这些静态内容有更新应该怎么办?笔者在这里留个悬念,先恭喜你看完了本书的第一章节,先泡杯热茶喝喝,等会接着往下看。。。

2.消除对long-time缓存的恐惧

你看过电影《Batman 2005 : Begins》 么?主人公Bruce Wayne因对蝙蝠的恐惧而最终以蝙蝠侠的形象出没在高森市打击警察所难以打击的犯罪。作为一个准优化师(不知道这个词语是否使用恰当),我们得要消除对super long time cache(超长缓存)的恐惧,并在以后的WEB优化生涯中驾驭它。

如果你看到一个图片,缓存为10年(31560000秒),站长对图片编辑了一下,但重新进入这页面,图片自动刷新成了最新的版本。这是为什么呢?

HTTP1.0标准协议中规定,HTTP缓存只对单独的URL有效。

url通常是http://static.yourname.com/pic/upload/test001.jpg这样的,而在上面这个网站,站长在上传好图片后,在URL后带了类似?20130219_1这样的参数,

这样,http://static.yourname.com/pic/upload/test001.jpg就成了http://static.yourname.com/pic/upload/test001.jpg?20130219_1,在访问这个页面时加载了这个URL,输出了10年的缓存,不过缓存只对这个URL有效,对http://static.yourname.com/pic/upload/test001.jpg?20130219_2无效的,所以站长在上传新图片后只需简单地编辑URL版本为一个新的即可突破浏览器、中间节点的缓存。

所以,对于“超长缓存”,完全没有必要恐惧的,并且我们还要试着接受她。