http的缓存
[TOC]
1、缓存的分类
缓存分为服务端缓存和客户端缓存:
-
服务端缓存又分为代理服务器缓存和反向代理服务器缓存(又称网关缓存,例如Nginx反向代理,Squid等),最常用的CDN就是一种服务端缓存,通常用来缓存一些静态资源如图片,文件等,目的是让请求能够走捷径;
-
客户端缓存通常指浏览器缓存,其目的就是加快各种静态资源的获取,如果一个网站不使用缓存,其每天处理上亿的请求,每次请求均需返回这种静态资源,这样不仅会严重降低服务器响应时间也会给用户带来不好的用户验,同时也会给服务器和网宽带来严重的压力;
2、缓存的优点
-
减少相应延迟:客户端直接从缓存中取得数据,而不是从服务器中获取数据,这个过程的耗时更少,从而看起来没有延迟。
-
减少网络带宽消耗:当缓存中的数据被重用时可降低客户端的带宽消耗;
3、缓存机制
a、相关概念
-
Expires策略: 响应消息头中设置,用于控制响应资源的过期时间。客户端在过期时间之前访问时,是直接从缓存中获取响应数据;过期时间后访问时,是将访问服务器获取数据。缺点:Expires返回的是服务器时间,如果服务器和客户端的时间相差很大时,那么过期时间段的误差也会很大,所以http 1.1版本后尽量不在使用,而是使用Cache-Control:max-age=秒 替代
-
Cache-Control:Cache-Control和Expires的作用一样用于控制响应资源的有效期,从而控制客户端是从缓存中取数据还是重新请求服务器。其不仅比Expires的优先级更高,而且更加的细致,常见取值如下:
Public: 指示响应可被任何缓存区缓存。
Private: 指示资源只能缓存到私有缓存中。
no-cache: 指示请求或响应消息建议缓存,但还是缓存到了客户端,其于Last—Modified配合使用。
no-store: 所有内容都不会被缓存,用于防止重要的信息被无意的发布。
max-age: 指示缓存的过期时间。
min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale: 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
-
Last-Modified: 表示这个资源的最后响应时间,服务器响应客户端时设置在header中;
-
If-Modified-Since: 当前资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。
-
Etag: 服务器为当前资源提供的唯一标识(生产规则由服务器) ,Apache是由文件索引(INode),size和最后修改时间Hash得到 。
-
If-None-Match: 资源过期时,发现有Etag值时,请求服务器时带上if-None-Match字段,服务器收到字段与响应资源对比决定返回200或者304.
b、缓存策略
缓存策略可划分为缓存存储策略,缓存过期策略,缓存对比策略。
-
缓存存储策略: 用来控制服务器响应的资源是否能够缓存到客户端以及那些资源可以缓存到客户端,通常由Cache-Control控制,其值通常有public,private,no-cache,max-age,no-store等,前四个运行资源缓存到客户端,最后一个不允许;缓存到客户端的资源是否有效是由缓存过期时间控制的;no—cache,max-age也属于混合策略,也能控制资源有效期;
-
缓存过期策略: 用来控制缓存的资源是否有效,进而控制请求是获取缓存中的数据还是重新请求服务器;通常由Expires和Cache-Control的no-cache和max-age控制,当他们同时出现时,Cache-Control的优先权高于Expires,注意当资源过期了并不意味着当前资源没用了,是否没用需要请求一遍服务器进行确认;
-
缓存对比策略: 当前资源过期后,客户端重发请求到服务器时带上标识(Last-Modified,If-Modified-Since,If-None-Match),当服务端接受到客户端请求时,先判断标识是否有效,若有效返回304不用重新返回数据,客户端直接取缓存数据,若无效返回200,服务器重新返回数据;
策略如下图所示:
4、带缓存的用户请求
用户第一次请求服务器流程图:
第二次请求服务器流程图:
试题分析
- A
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: image/png
Last-Modified: Tue, 08 Nov 2016 06:59:00 GMT
Accept-Ranges: bytes
Date: Thu, 10 Nov 2016 02:48:50 GMT
Content-Length: 3534
存储策略:no-cache,允许存储到客户端 过期策略:no-cache,立即过期 对比策略:last-modified被带到服务器端用于判断返回200还是304
- B
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: image/png
Last-Modified: Tue, 08 Nov 2016 06:59:00 GMT
Accept-Ranges: bytes
Date: Thu, 10 Nov 2016 02:48:50 GMT
Content-Length: 3534
存储策略:private,允许部分存入私有缓存中 过期策略:未知名,默认去Date减去Last-Modified的时间段的10%作为过期时间; 对比策略:客户端请求服务器时,last-modified被带到服务器端用于判断返回200还是304
5、参考文档
http://blog.csdn.net/chelp/article/details/44457143 http://blog.csdn.net/bpingchang/article/details/51328941 http://www.tuicool.com/articles/zUZnUre
- 上一篇 web发送请求到用户看到响应的整个过程
- 下一篇 XML文件的Dom解析和SAX解析