http 缓存 待整理

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

1 引入cache

1.1 影响网络速率的原因是什么

由距离和光速引起

1.2 加快网络速率的思路、方法、实际措施?

n思路:加速Web访问的核心--缩短客户端与网站之间的距离

n方法:将用户频繁访问的页面和对象存放在离用户更近的地方。减少光速引入的延时;同时由于减少了路由中的环节,也相应地减少了路由器、防火墙和代理等引入的延时

n实际措施:cache

1.3 使用cache的好处

(1)减少请求次数

(2)减少请求数据大小

(3)缩短传输距离

(4)(提高传输速率)--间接的

2 缓存分类

2.1浏览器缓存

2.1.1Http的协商缓存 --last-modified(响应头),If-Modified-Since(请求头)

在第一次访问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

2.1.2Http的协商缓存 �CEtag(响应头http1.1If-None-Match(请求头)

一个文件存放在多台web服务器上,用户的请求在这些服务器上之间轮询,实现负载均衡,那这个文件在各台web服务器的最后修改时间很可能是不一样,这样用户每次请求到的web服务器都可能是不同,Last-ModifiedIf-Modified-Since则无法对应,导致每次都需要重新获取内容,这时候采用直接标记内容的Etag算法,就可以避免上述的问题
Etag
是由Web服务器生成的,如Apache为一个静态文件新增响应头为
Etag    "e3af4060-5-472bedf076880" 浏览器获得这个Etag后,便会在下次请求该页面时,在HTTP的请求头附上If-None-Match    "e3af4060-5-472bedf076880",与web服务器上的Etag值相比较,如果是相同的话,便返回304状态,不同则重新返回新页面信息

注意:当多台web服务器为不同类型的服务器(使用服务器集群的网站)时,如apacheiis,那etag也会出问题,因为apacheiisEtag格式不一样:

Apache―inode-size-timestamp

Iis―filetimestamp:changeNumber

而即使是同一类型的web服务器,同一个组件的etag也不一样。因为,不同版本的apache,同一个组件的inode是不一样的;不同版本的iis,同一个组件的changeNumber也不能保持一致。

2.1.3ETag vs Last-Modified

通过跟踪了一下apache1.3的源码,得知etag的优先级高于last modified。呵呵,所以yahoo的优化法则上说关闭etag,不无道理晒。

agent带上etag的返回的这个键值If-None-Match的处理优先于last modifiedIf-Modified-Since


2.1.4彻底(本地)缓存 --cache-control (请求/响应头)

(1)请求时的缓存指令包括no-cacheno-storemax-agemax-stalemin-freshonly-if- cached

no-cache:不进行缓存

no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存

max-age=x:缓存时间以秒为单位

max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

(2)响应消息中的指令包括publicprivateno-cacheno-storeno-transformmust- revalidateproxy-revalidatemax-age

Public响应会被缓存,并且在多用户间共享。

Private响应只能够作为私有的缓存,不能再用户间共享(比如不与代理共享)

must-revalidate:如果页面是过期的则去服务器进行获取。

2.1.5彻底(本地)缓存 --Expires(响应头)

(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");

2.1.6Expires vs Cache-Control(better)

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 的指示。

2.1.7其他

(1)Offline API

(2)Localstorage

(3)Flash Player Cache

2.2 其他

CDN

Web服务器缓存

应用程序缓存

数据库缓存

3 不同浏览器的缓存

不同缓存方式的不同标志失效时,不同的浏览器的处理方式不同,

不同浏览器的缓存行为.htm

4  Ctrl + F5 F5 或浏览器刷新按钮,转向或回车或超链接

(1)Ctrl + F5

浏览器将绕过本地缓存、协商缓存,让服务器重新发送请求的资源。

(2)F5 或浏览器刷新按钮

浏览器将绕过本地缓存,将使用协商缓存来请求资源。

(3)转向或回车或超链接

浏览器将使用本地缓存、协商缓存。


你可能感兴趣的:(http,缓存)