1.与浏览器缓存相关的http headers
Cache-Control(用于本地缓存),Expires(用于本地缓存),Last-Modified(协商缓存),Etag(协商缓存)
Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache- Control并不会修改另一个消息处理过程中的缓 存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if- cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
Expires:定义与http 1.0,是一个绝对时间,作用相同于max-age,我理解的应该是这样nowTime+maxAge=expires;(用于本地缓存)
Last-Modified:被访问的资源的最近一次更改时间(http1.0)
Etag:资源的一个唯一标志(http1.1)
2.我们一般的浏览器操作
在浏览器(如IE)中有几种操作,如下:
Ctrl + F5
浏览器将绕过本地缓存、协商缓存,让服务器重新发送请求的资源。
F5
浏览器将绕过本地缓存,将使用协商缓存来请求资源。
转向或回车(火狐下回车直接跳过本地缓存和协商缓存2012/02/29)
浏览器将使用本地缓存、协商缓存。
3.客户端缓存的应用
http://localhost/car_comment/trend_10_w.html
线上地址
http://data.auto.sina.com.cn/car_comment/koubeiTrend.php?subid=10&type=w
程序响应结果
2.数据对比
A)未使用客户端缓存的响应头
F5、Ctrl+F5、转到,返回结果一样
Date | Thu, 25 Aug 2011 09:13:29 GMT |
Server | Apache/2.2.8 (Win32) PHP/5.2.6 |
X-Powered-By | PHP/5.2.6 |
Content-Length | 1011 |
Keep-Alive | timeout=5, max=99 |
Connection | Keep-Alive |
Content-Type | image/png |
可见http status 都是返回200 都没有使用浏览器缓存
B)使用客户端缓存的响应头
转到
Date | Thu, 25 Aug 2011 09:27:24 GMT |
Server | Apache/2.2.8 (Win32) PHP/5.2.6 |
X-Powered-By | PHP/5.2.6 |
Cache-Control | max-age=23556 |
Expires | Thu, 25 Aug 2011 16:08:00 GMT |
Last-Modified | Tue, 23 Aug 2011 16:08:00 GMT |
Content-Length | 1011 |
Content-Type | image/png |
http status 200,应用浏览器缓存1011B
解释:
http Reponse 中的
Date Thu, 25 Aug 2011 09:27:24 GMT
Cache-Control max-age=23556 //http 1.1
Expires Tue, 23 Aug 2011 16:08:00 GMT //http1.0
此种情况下的缓存若还没有过期,则被浏览器使用
F5刷新
Date | Thu, 25 Aug 2011 09:32:09 GMT |
Server | Apache/2.2.8 (Win32) PHP/5.2.6 |
X-Powered-By | PHP/5.2.6 |
Cache-Control | max-age=23271 |
Expires | Thu, 25 Aug 2011 16:08:00 GMT |
Last-Modified | Tue, 23 Aug 2011 16:08:00 GMT |
Content-Length | 1011 |
Content-Type | image/png |
http status 304没有发生变化,应用浏览器缓存1011B
当http reponse中含有
Last-Modified Tue, 23 Aug 2011 16:08:00 GMT
再下一次请求相同资源时
http request中含有
If-Modified-Since Tue, 23 Aug 2011 16:08:00 GMT
如果是静态化的资源,服务器会检查文件的最后修改时间并与客户端请求的修改时间做对比,如果未发生改变则返回304,验证结果为客户端缓存可用,浏览器使用客户端资源。动态生成的响应服务器无法计算最后修改时间,只能程序自己计算,并返回相应的结果
如果后端数据未发生变化则返回304 。则只返回http headers,浏览器载入缓存
F5+Ctrl刷新或者第一次打开
Date | Thu, 25 Aug 2011 09:33:37 GMT |
Server | Apache/2.2.8 (Win32) PHP/5.2.6 |
X-Powered-By | PHP/5.2.6 |
Cache-Control | max-age=23183 |
Expires | Thu, 25 Aug 2011 16:08:00 GMT |
Last-Modified | Tue, 23 Aug 2011 16:08:00 GMT |
Content-Length | 1011 |
Keep-Alive | timeout=5, max=100 |
Connection | Keep-Alive |
Content-Type | image/png |
强制服务端返回最新结果Catch-Control no-cache;Param no-cache
Host | localhost |
User-Agent | Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 |
Accept | text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
Accept-Language | zh-cn,zh;q=0.5 |
Accept-Encoding | gzip,deflate |
Accept-Charset | GB2312,utf-8;q=0.7,*;q=0.7 |
Keep-Alive | 115 |
Connection | keep-alive |
Pragma | no-cache |
Cache-Control | no-cache |
3.提升服务器性能
没有使用浏览器缓存时的服务器吞吐量 235.87次/秒
启用客户端缓存后的服务器吞吐量(Requests per second)为906.91次/秒 mean表示平均值,提升了近3.8被,再看一下纯静态html时的服务器吞吐量
是我们使用第一种方式的9.96被,是启用浏览器缓存的2.59倍,所以内容不再更新的页面还是直接发布为静态页面比较好
4.页面响应时间
没有启用缓存时的响应时间分布
一共耗时0.038秒,Wait时间就是我们服务器端执行时间和网络延时,本地测试基本可以忽略网络延时,大概为0.033.
启用缓存后的压面响应时间分布
一共耗时0.009秒,Wait时间就是我们服务器端执行时间和网络延时,本地测试基本可以忽略网络延时,大概为0.005.提高的速度还是很明显的