您的位置:首页 > 理论基础 > 计算机网络

大并发服务器不得不说的技术--http 缓存

2013-03-20 16:10 218 查看
前面所说技术订都是服务器端一个人在努力,有时候也需要客户端配合。

一个链接请求过程大致可以分成几个阶段



如果客户端发送同样的请求,且结果都一样,我们是不是可以缓冲一下呢?是不是可以减少几步呢?

的确可以,一般来说以下几种方法:

1.我们先试着在服务端进行缓冲,我们试着将一个已经返回的长链接发送内容不作释放,下次请求时直接返回刚才发送的内容,这个不适用于频繁访问,适用于一些特殊的情况,特殊的请求。

2.对于静态的文件都有上次修改时间lastupdatetime,客户端第一次请求返回的http头包含这个 lastupdatetime,接着客户端将页面加到缓存里,第二次请求头里包含lastupdatetime,服务端将它和当前的lastupdatetime 进行比较,如果一样,直接告诉客户端文件还没修改,直接用你缓存里的。

实际上http返回头存更新时间的字段是Last-Modified,请求头的字段是If-Modified-Since



返回包头

HTTP/1.1 200 OK

Date: Wed, 20 Mar 2013 07:35:22 GMT

Content-Type: text/html; charset=UTF-8

Content-Encoding: gzip

Last-Modified: Wed, 20 Mar 2013 07:35:22 GMT

Transfer-Encoding: chunked

Server: yumeiz

请求包头

GET / HTTP/1.1

Host: www.xxx.com

Connection: keep-alive

If-Modified-Since: Wed, 20 Mar 2013 07:35:22 GMT

再次返回包头:

HTTP/1.1 304 Not Modified

对于一些没有修改时间的动态请求,服务端可以约定一个字段,当第二次请求发现这个字段没变,也告诉客户端直接用缓存里的内容。

实际上这个字段是ETag,请求头的字段是If-None-Match



返回包头(只点到相应字段,其他与上面一致)

ETag="ABCD"

请求包头

If-None-Match=W/"ABCD"

通过上面我们知道当客户端收到一个 304 Not Modified 的包头时,就意味着可以直接用缓存里的页面,对一些频繁请求的文件如JS,CSS有不小的作用,还有一些块头很大的图像文件,意味着送去了救命道草。。。

3.上面的几种方法实际上都需要服务端参与,我们知道有些文件如JS,CSS,HTML,改变的频率实在太小,但是请求的频率又实在太大,有请求就有压力,服务端就算返回304也还有很大的并发压力,那么是不是可以让客户端直接用缓存里而不再确认呢?

还记得cookie有个过期时间吗,请求也可以有过期时间,当这个请求还没过期的情况下再次请求,客户端直接加载缓存的页面,不再确认,no check, no link, no server!

这样就彻底与服务器失去的联系,给服务器减轻多少压力,减少了多少带宽。。。

实际上这个这个字段是 Expires



HTTP/1.1 200 OK

Date: Wed, 20 Mar 2013 07:35:22 GMT

Content-Type: text/html; charset=UTF-8

Content-Encoding: gzip

Expires: Wed, 20 Mar 2013 08:01:22 GMT

Transfer-Encoding: chunked

Server: yumeiz

还有一个字段 max-age,作用一样,而且可以覆盖Expires。

max-age意思就是从现在开始,这个页面要经过多少秒才过期。

max-age 的使用方式:

Cache-Control:max-age=3600

回头看看,第1,2种方法其实是省略了服务端的业务处理,第3种方法是压根儿没服务端啥事了,相当于一段时间内脱机处理,虽然有悖于互联的精神,但是确实能解决问题。

以上几种方法也可以混合使用,如返回包头同时包含expires和Last-Modified,如

HTTP/1.1 200 OK

Date: Wed, 20 Mar 2013 07:35:22 GMT

Content-Type: text/html; charset=UTF-8

Content-Encoding: gzip

Last-Modified: Wed, 20 Mar 2013 03:35:22 GMT

Expires: Wed, 20 Mar 2013 08:01:22 GMT

Transfer-Encoding: chunked

Server: yumeiz

当expires没有过期前直接用客户端的缓存,如果过期了则再请求服务端,服务端检查文件修改时间没变则返回304,同时刷新expires.

如:

HTTP/1.1 304 Not Modified

Server: yumeiz

Date: Wed, 20 Mar 2013 08:02:22 GMT

Vary: Accept-Encoding

Last-Modified: Wed, 20 Mar 2013 03:35:22 GMT

Expires: Wed, 20 Mar 2013 08:35:22 GMT

Cache-Control: max-age=31536000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: