HTTP协议4之缓存--转

HTTP协议提供了很是强大的缓存机制, 了解这些缓存机制,对提升网站的性能很是有帮助。 html

缓存的概念

缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存。数据库

http中具备缓存功能的是浏览器缓存以及缓存代理服务器。浏览器

http缓存的是指:当Web请求抵达缓存时, 若是本地有“已缓存的”副本,就能够从本地存储设备而不是从原始服务器中提取这个文档。缓存

缓存的好处

缓存的好处是显而易见的, 好处有,服务器

1. 减小了冗余的数据传输,节省了网费。session

2. 减小了服务器的负担, 大大提升了网站的性能工具

3. 加快了客户端加载网页的速度性能

 

Fiddler能够方便地查看缓存的header

Fiddler中把header都分门别类的放在一块儿,这样方便查看。网站

 

Requestfirefox

Cache-Control: max-age=0 以秒为单位
If-Modified-Since: Mon, 19 Nov 2012 08:38:01 GMT 缓存文件的最后修改时间。
If-None-Match: "0693f67a67cc1:0" 缓存文件的Etag值
Cache-Control: no-cache 不使用缓存
Pragma: no-cache 不使用缓存
   

 

 

    

 

 

 

Response

Cache-Control: public 响应被缓存,而且在多用户间共享,  (公有缓存和私有缓存的区别,请看另外一节
Cache-Control: private 响应只能做为私有缓存,不能在用户之间共享
Cache-Control:no-cache 提醒浏览器要从服务器提取文档进行验证
Cache-Control:no-store 绝对禁止缓存(用于机密,敏感文件)
Cache-Control: max-age=60 60秒以后缓存过时(相对时间)
Date: Mon, 19 Nov 2012 08:39:00 GMT 当前response发送的时间
Expires: Mon, 19 Nov 2012 08:40:01 GMT 缓存过时的时间(绝对时间)
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT 服务器端文件的最后修改时间
ETag: "20b1add7ec1cd1:0" 服务器端文件的Etag值

 

 

 

 

 

 

 

 

若是同时存在cache-control和Expires怎么办呢?

浏览器老是优先使用cache-control,若是没有cache-control才考虑Expires  

如何判断缓存新鲜度

Web服务器经过2种方式来判断浏览器缓存是不是最新的。

第一种, 浏览器把缓存文件的最后修改时间经过 header ”If-Modified-Since“来告诉Web服务器。

第二种, 浏览器把缓存文件的ETag, 经过header "If-None-Match", 来告诉Web服务器。

经过最后修改时间来判断缓存新鲜度

1. 浏览器客户端想请求一个文档,  首先检查本地缓存,发现存在这个文档的缓存,  获取缓存中文档的最后修改时间,经过: If-Modified-Since, 发送Request给Web服务器。

2. Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 若是时间是同样的, 说明缓存仍是最新的, Web服务器将发送304 Not Modified给浏览器客户端, 告诉客户端直接使用缓存里的版本。以下图。

3. 假如该文档已经被更新了。Web服务器将发送该文档的最新版本给浏览器客户端, 以下图。

 

实例: 打开Fiddler, 而后打开博客园首页。而后F5刷新几回浏览器。 你会看到博客园首页也用了缓存。

 

ETag

ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串,能够标识资源的状态。 当资源发送改变时,ETag也随之发生变化。

ETag是Web服务端产生的,而后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。

为何使用ETag呢? 主要是为了解决Last-Modified 没法解决的一些问题。

1. 某些服务器不能精确获得文件的最后修改时间, 这样就没法经过最后修改时间来判断文件是否更新了。

2. 某些文件的修改很是频繁,在秒如下的时间内进行修改. Last-Modified只能精确到秒。

3. 一些文件的最后修改时间改变了,可是内容并未改变。 咱们不但愿客户端认为这个文件修改了。

实例, 打开Fiddler, 打开博客园首页。  你能够看到不少图片,或者CSS文件都是用了缓存。 这些都是经过比较ETag的值,来判断文件是否更新了。

 

浏览器不使用缓存

CTRL+F5强制刷新浏览器,或者设置IE。  可让浏览器不使用缓存。

1. 浏览器发送Http request, 给Web 服务器, header中带有Cache-Control: no-cache.   明确告诉Web服务器,客户端不使用缓存。 

2. Web服务器将把最新的文档发送给浏览器客户端.

实例:

打开Fiddler, 打开博客园首页, 而后按CTRL+F5强制刷新浏览器,你将看到

Pragma: no-cache的做用和Cache-Control: no-cache如出一辙。 都是不使用缓存。 

Pragma: no-cache 是HTTP 1.0中定义的, 因此为了兼容HTTP 1.0. 因此会同时使用Pragma: no-cache和Cache-Control: no-cache

 

直接使用缓存,不去服务器验证

按F5刷新浏览器和在地址栏里输入网址而后回车。 这两个行为是不同的。

按F5刷新浏览器, 浏览器会去Web服务器验证缓存。

若是是在地址栏输入网址而后回车,浏览器会"直接使用有效的缓存", 而不会发http request 去服务器验证缓存,这种状况叫作缓存命中

实例: 比较第一次访问博客园主页和第二次博客园主页

1. 启动Fiddler, 用firefox打开博客园主页, 发现有50多个session。

2. 按CTRL+X将Fiddler中的全部session删除。 关闭firefox,从新打开一个firefox,打开博客园主页。   发现只有30多个session.

分析;  少了的session是由于firefox直接用了缓存,而没有发http request。

 

 

如何设置IE不使用缓存

打开IE。点击工具栏上的, 工具->Internet选项->常规->浏览历史记录 设置. 选择“从不”。而后保存。

而后点击“删除”  把Internet临时文件都删掉 (IE缓存的文件就是Internet临时文件)。

 

公有缓存和私有缓存的区别

Cache-Control: public 指能够公有缓存, 能够是数千名用户共享的。

Cache-Control: private 指只支持私有缓存, 私有缓存是单个用户专用的。

 
转:http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html
相关文章
相关标签/搜索