Last-Modified: Mon, 24 Nov 2008 11:03:02 GMT
Cache-Control: max-age=11 (阅读器会cache这个页面内容,然后将cache过时时间设置为当前时间+11秒)
Content-Length: 312
Connection: Keep-Alive
按F5刷新
GET /today.js?maxage=11 HTTP/1.1
Host:sports.sinajs
Connection: keep-alive
If-Modified-Since: Mon, 24 Nov 2008 11:03:02 GMT (按F5刷新,If-Modified-Since将上次办事器传过来的Last-Modified时间带过来)
Cache-Control: max-age=0
HTTP/1.x 304 Not Modified
Server: Cloudia
Connection: Keep-Alive
Cache-Control: max-age=11 (这个max-age有些多余,阅读器发现Not Modified,将使用本地cache数据,但不会重新设置本地过时时间)
继续按F5刷新n次……
这11秒内未产生http请求。直到11秒曩昔了……
按F5刷新
GET /today.js?maxage=11 HTTP/1.1
Host: sports.sinajs
Connection: keep-alive
If-Modified-Since: Mon, 24 Nov 2008 11:03:02 GMT (多次按F5城市产生一个带If-Modified-Since的请求)
Cache-Control:max-age=0
HTTP/1.x 304 Not Modified
Server:Cloudia
Connection: Keep-Alive
Cache-Control: max-age=11
按F5刷新
GET /today.js?maxage=11 HTTP/1.1
Host: sports.sinajs
Connection: keep-alive
If-Modified-Since: Mon, 24 Nov 2008 11:03:02 GMT (同上 。..)
Cache-Control:max-age=0
HTTP/1.x 304 Not Modified
Server: Cloudia
Connection: Keep-Alive
Cache-Control: max-age=11
四,我对HTTP协议做的一点创新(?maxage=6000000)
上面看到了url后面有 ?maxage=xx 这样的用法,这不是一个普通的参数,作用也不但仅是看起来那么简单。他至少有以下几个益处:
1,可以节制HTTP header的的 max-age 值。
2, 让用户为每个资源矫捷定制切确的cache时间长度。
3, 可以代表资源版本号。
首先谈论对后真个影响:
办事器实现那块,不消再load近似mod_expires,mod_headers 这样额外的module,也不消去加载那些法则去比较,它属于什么目录,或什么文件类型,应该cache多少时间,这样的操作是需要开消的。
再说说对前真个影响:
比如同一个分时行情图片,我们的分时页中需要1分钟更新,而某些首页中3分钟更新好。不消js节制的话,那我cache应该设置多少呢? 有了maxage就可以满足这种个性化定制需求。
另外一种情况是,我们为了cache,把某个图片设置了一个永久cache,可是由于需求,我必须更新这个图片,那怎么让用户拜候到这个更新了的图片呢? 从yahoo的资料和目前所有能找到的资猜中都描述了同一种体例,更改文件名字,然后引用新的资源。 我感觉这体例太土, 改名后,老的还不克不及删除,可能还有处所在用,同一资源可能要存两份,再修改,又得改个名,存3份,不要不把inode当资源。 我就不那样做,只需要把maxage=6000000 修改成 maxage=6000001 ,问题就解决了。
maxage=6000000 所产生的威力 (内存块消耗削减了250倍 ,请求数削减了37倍) :
体育那边要上一个新功能,一起头动态获得那些数据,我感觉那样太华侈动态池资源,就让他们把xml文件到转移到我的js池上来,为了便利,他们把那个84k的flash文件也放在了一起,并且是每个用户必须拜候的。 说实在的,我不欢迎这种年夜块头,因为它不成压缩,按正常来讲,它应该代表一个3M的文件。我的办事器只这样设计的,如果一次发送不完的就暂存在内存里,每个内存块10k,如果不带参数默认maxage=120 。 我发现,由于这个文件,10w connections的时候,我消耗了10000个内存块。我自己写的申请持续内存的算法也是消耗cpu地, 一个84k的文件,发送一次后,剩余的64k就应该能装的下,于是我把最小内存块年夜小改成64K。 这样消耗10w conn的时候消耗1500个左右内存快,虽然内存消耗总量没怎么变小,可是它能更快的拿到64K的持续内存资源,cpu也节俭下来了。接下来我让meijun把所应用的flash资源后面加上maxage=6000000 (年夜概=79天,阅读器端最长cache能达到着个就不错了), 10w connections的时候,只消耗了不到40个内存块,也就是说内存块消耗削减了250倍 ,请求数削减了37倍。 35w+ connections, 5.67w req/s的时候也就消耗100块左右,比线性增加要少很多。也就是这点发现让我有了做这个手艺分享的打动,其他都是顺便讲讲。
五.Yslow优化网站性能的14条军规点评