1 引入cache1
1.1影响网络速率的原因是什么. 1
1.2 加快网络速率的思路、方法、实际措施?. 1
1.3 使用cache的好处. 1
2 缓存分类. 2
2.1浏览器缓存. 2
2.1.1Http的协商缓存 --last-modified(响应头),If-Modified-Since(请求头)2
2.1.2Http的协商缓存 �CEtag(响应头http1.1) If-None-Match(请求头)2
2.1.3ETag vs Last-Modified2
2.1.4彻底(本地)缓存--cache-control (请求/响应头)3
2.1.5彻底(本地)缓存--Expires(响应头). 3
2.1.6Expires vs Cache-Control4
2.1.7其他. 4
2.2 其他. 5
CDN5
Web服务器缓存. 5
应用程序缓存. 5
数据库缓存. 5
3 不同浏览器的缓存. 5
4 Ctrl + F5 , F5 或浏览器刷新按钮,转向或回车或超链接. 5
由距离和光速引起
n思路:加速Web访问的核心--缩短客户端与网站之间的距离
n方法:将用户频繁访问的页面和对象存放在离用户更近的地方。减少光速引入的延时;同时由于减少了路由中的环节,也相应地减少了路由器、防火墙和代理等引入的延时
n实际措施:cache
(1)减少请求次数
(2)减少请求数据大小
(3)缩短传输距离
(4)(提高传输速率)--间接的
在第一次访问web服务器返回200状态时,会在浏览器的响应头Last-Modified上写上此页面最后修改的时间戳。
在再次访问时,浏览器会把第一次返回Last-Modified的时间戳记录到If-Modified-Since,并作为请求头信息发送到服务区,web服务器会通过If-Modified-Since上的时间戳来判断用户的页面是否是最新的,如果不是最新的,则返回新的页面并修改响应头Last-Modified时间戳给用户,如果判断是最新的,则返回304状态并告诉浏览器本地的cache页面是最新的,浏览器可以直接加载本地页面,这样可以减少网络上传输的数据,并且也减少服务器的负担
注意的是,HTTP协议中规定使用的是GMT时间(格林威治),而我们国家使用的是GMT+8的时间,所以我们从firebug中看到的时间是比我们早了8个小时,不过这没关系,它并不影响到缓存的对比工作
(如果组件因经常变化而不被缓存,我们期望看到最近的last-modified)
一个文件存放在多台web服务器上,用户的请求在这些服务器上之间轮询,实现负载均衡,那这个文件在各台web服务器的最后修改时间很可能是不一样,这样用户每次请求到的web服务器都可能是不同,Last-Modified和If-Modified-Since则无法对应,导致每次都需要重新获取内容,这时候采用直接标记内容的Etag算法,就可以避免上述的问题
Etag是由Web服务器生成的,如Apache为一个静态文件新增响应头为
Etag "e3af4060-5-472bedf076880" 浏览器获得这个Etag后,便会在下次请求该页面时,在HTTP的请求头附上If-None-Match "e3af4060-5-472bedf076880",与web服务器上的Etag值相比较,如果是相同的话,便返回304状态,不同则重新返回新页面信息
注意:当多台web服务器为不同类型的服务器(使用服务器集群的网站)时,如apache和iis,那etag也会出问题,因为apache和iis的Etag格式不一样:
Apache―inode-size-timestamp
Iis―filetimestamp:changeNumber
而即使是同一类型的web服务器,同一个组件的etag也不一样。因为,不同版本的apache,同一个组件的inode是不一样的;不同版本的iis,同一个组件的changeNumber也不能保持一致。
通过跟踪了一下apache1.3的源码,得知etag的优先级高于last modified。呵呵,所以yahoo的优化法则上说关闭etag,不无道理晒。
agent带上etag的返回的这个键值If-None-Match的处理优先于last modified的If-Modified-Since
(1)请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if- cached
no-cache:不进行缓存
no-store:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存
max-age=x:缓存时间以秒为单位
max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
(2)响应消息中的指令包括public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate、max-age
Public:响应会被缓存,并且在多用户间共享。
Private响应只能够作为私有的缓存,不能再用户间共享(比如不与代理共享)。
must-revalidate:如果页面是过期的则去服务器进行获取。
(1)Expires标记告诉浏览器该页面何时过期,并且在此过期前不需要再访问web服务器,直接使用本地的缓存文件即可,这样请求响应头都不需要,确实节省了带宽和服务器的开销,但是就算页面在web服务器上更新后在Expires过期前也不会出现在用户面前,究竟是否应该在于我们的实际应用和取舍
(2)作用相同于max-agenowTime+maxAge=expires
(3)下面是Apache中提供的mod_expires模块(通过配置文件控制HTTP的"Expires"和"Cache-Control"头内容)
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A600
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A604800
ExpiresByType text/css A604800
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType text/plain A86400
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType video/x-flv A2592000
ExpiresByType application/pdf A2592000
ExpiresByType text/html A600
</IfModule>
或者(详细分析见:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_expires.html )
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 12 hours"
ExpiresByType text/html "access plus 3 days"
ExpiresByType text/plain "access plus 3 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/x-icon "access plus 30 days"
ExpiresByType video/x-flv "access plus 30 days"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
</IfModule>
我们在jsp文件也可以指定expires的过期时间
response.addHeader("Expires",DateUtl.format(new java.util.Date())+" GMT");
Expires 指定的过期时间,是来自于Web服务器的系统时间,如果用户本地的时间和服务器时间不一致的话,那一定会影响到本地缓存的有效期检查,(要求服务器和客户端的时钟严格同步)没有人能够保证到用户本地时间与Web服务器严格一致。幸运的是,HTTP/1.1中还有一个标记用于弥补Expires 的不足,那就是Cache-Control ,它的格式如下:
Cache-Control: max-age=<second>
max-age指定了缓存过期的相对时间,单位是秒,并且这个时间是相对于浏览器本地时间而言。目前主流的浏览器都将HTTP/1.1 作为首选,所以当HTTP响应头中同时含有Expires 和Cache-Control 时,浏览器会优先考虑Cache-Control。对于没有Cache-Control 的情况,浏览器则会服从Expires 的指示。
(1)Offline API
(2)Localstorage
(3)Flash Player Cache
不同缓存方式的不同标志失效时,不同的浏览器的处理方式不同,
见不同浏览器的缓存行为.htm
(1)Ctrl + F5
浏览器将绕过本地缓存、协商缓存,让服务器重新发送请求的资源。
(2)F5 或浏览器刷新按钮
浏览器将绕过本地缓存,将使用协商缓存来请求资源。
(3)转向或回车或超链接
浏览器将使用本地缓存、协商缓存。