web缓存是自动保存常用的文档副本的HTTP设备,当web请求到达缓存时,如果缓存本地有“已缓存的”副本,就可以从本地设备,而不是从原始服务器发获取这个文档。
缓存的优点:
1、缓存减少了冗余的数据传输
2、缓存缓解了网络瓶颈的问题
3、缓存降低了对原始服务器的请求
4、缓存降低了距离的时延
一、缓存的分类
缓存可以是单个用户专用的,也可以是数千个用户共享的。专用缓存称为私有缓存(private cache),共享的缓存称为公有缓存(public cache)。
1、私有缓存
私有缓存不需要很大的空间,这样成本便宜。web浏览器都是有内建的私有缓存--大多数的浏览器都会将常用的缓存文档在你的个人磁盘或内存中,并且允许用户去配置缓存的大小和各种配置。
2、共享缓存
共享缓存是特称的共享代理服务器,被称为缓存代理服务器(caching proxy server),或者更常见的被称为代理缓存(proxy cache)。代理缓存会从本地缓存文档中提供文档,或代表用户与服务器联系。
二、缓存的新鲜
可能并不是所有缓存的文档副本都与服务器上的文档的一致。毕竟,随着时间的推移,这些文档会发生变化。
HTTP有一引起简单的机制,可以在不要求服务器记住有哪些缓存拥有其文档副本的情况下,使得已缓存的文档副本和服务器上的文档保持一致。HTTP将这些简单的机制称为文档过期(document expiration)和服务器再验证(server revalidation)。
1、文档过期
通过使用HTTP的Cache-Control首部和Expires首部,HTTP让原始服务器向每个文档附加了一个“过期日期”,
Cache-Control首部
Cache-Control: max-age=484200
Expires首部
Expires: Fri, 05 Jul 2014, 05:00:00 GMT
在文档过期前,有请求到达时,缓存只提供已缓存的文档,而不是与原始服务器联系--当然,除非客户端请求中包含有阻止提供缓存或未验证资源的首部。但一旦文档过期了,缓存就必须与原始服务器进行核对,访问文档是否修改过,如果已修改过,则获取一份新的副本(带有新的过期日期)。
Expires首部和Cache-Control:max-age首部做的事情本质是一样,只不过Expires首部指是绝对的过期日期,而Cache-Control:max-age首部指定的是相对的过期日期。
由于绝对的过期日期依赖于电脑的设置时间,所以我们比较倾向于使用相对的过期日期。
首部 | 描述 |
Cache-Control:max-age | max-age定义的文档的最大使用期,从第一次生成文档到文档不再新鲜的时间,时间长度是秒。 Cache-Control: max-age=484200 |
Expires | 指定一个绝对的过期时间,到了过期时间,文档就不是最新的文档。 Expires: Fri, 05 Jul 2014, 05:00:00 GMT |
2、服务器再验证
如果缓存的文档过期了,并不能说明缓存副本与原始服务器上的处理活跃状态的文档有实际的区别;这只能说明到了核对文档的时间了。这种情况被称为“服务器再验证”,说明缓存需要访问原始服务器文档是否发生了变化。
- 如果再验证显示内容发生了变化,缓存会获取一份新的文档副本,并将其存贮在旧文档的位置上,并将其发送给客户端;
- 如果再验证显示内容没有发生变化,缓存只需要获取新的文档首部,包括一个新的过期日期,并对缓存的首部进行更新就行了。
3、用条件方法进行再验证
HTTP的条件方法可以高效进行再验证。HTTP定义了5个条件请求首部,对缓存再验证最有用的是2个首部:
If-Modified-Since 和 If-None-Match。
首部 | 描述 |
If-Modified-Since:<date> | 如果从指定日期之后文档被修改过,就执行请求的方法。可以与Last-Modified服务器响应首部配合使用,只有在内容被修改后与已缓存的文档版本有所不同才会获取内容。 If-Modified-Since: Sat, 29 Jun 2014, 13:30:00 GMT |
If-None-Match:<tags> | 服务器可以为文档提供特殊的标签,这些标签就像序号一样已经缓存标签与服务标签不一样,If-None-Match首部应付执行请求的方法。 If-None-Match: "v2.1" |
如果在If-Modified-Since指定的日期后,文档没有被修改过,即条件为假,服务器会向客户端返回304 Not Modified的响应报文,为提高有效性,不会返回文档的主体。
If-Modified-Since首部可以与Last-Modified服务器响应首部配合工作,如果在此期间,文档内容被修改过,那么最后的修改日期也会有所不同,原始服务器就会回送新的文档。
3.2、If-None-Match
如现在缓存的文档标签是v2.1,但服务器上此文档的标签已经变成v3.0,那么服务器会在200 OK响应中返回新的文档内容和新的标签v3.0
如果HTTP/1.1缓存或服务器收到的请求既有If-Modified-Since首部,也有If-None-Match首部,那么只有当两个条件首部都满足时,才会返回304 Not Modified响应。