http的缓存机制
http的缓存机制
前言
了解http的缓存机制有利于提高网站的性能,减少服务器的压力,加速响应客户端的请求。
什么是http的缓存?
httpd的缓存是在浏览器和web服务器或web代理服务器之间进行的。当客户端发送请求时,如果本地的浏览器缓存有“副本”(即请求的数据)的话,且副本在有效时间内的话,那么数据将直接从浏览器缓存中返回,这样,就不需要到后端原始服务器上进行加载了,从而达到减少网络带宽、提高web服务器性能的目的。
缓存的好处
1、减少了网络带宽
2、减少了服务器的压力,提高了web服务器的性能
3、可以加速响应客户度的请求
公共缓存和私钥缓存
公共缓存:即数据可以共享给多个用户
私钥缓存:缓存的数据只能被自己使用(如cookie信息就不能缓存在公共缓存上)
缓存数据的新鲜度
缓存数据的新鲜度表示缓存信息是否是最新的。web服务器通过二种方式来判断缓存的新鲜度:
一、浏览器把缓存数据的最近一次修改时间通过请求header “If-Modified-Since”来告诉web服务器,从而web服务器可以以此来判读缓存的新鲜度。
二、浏览器把缓存数据的ETag信息通过请求header “If-None-Match”告诉给web
服务器,从而web服务器可以以此来判读缓存的新鲜度。
通过请求header ” If-Modified-Since”方式来判断缓存数据的新鲜度的实现机制:
1、当客户端请求一个页面时,首先会在本地的浏览器中检查是否有缓存,如果没有,则直接向本地服务器请求;如果本地有这个页面,则查看这个页面的最近一次修改时间,并将http header “If-Modified-Since”参数添加到请求报文中,发送给服务器端。
2、当本地服务器收到这个请求时,会将请求报文中的页面最近一次修改时间和本地服务器上的页面最近一次修改时间进行对比,如果时间一样,表示缓存是最新的(即缓存没有更新),服务器会返回一个304 Not Modified信息给客户端,告诉客户端该页面没有更新,你可以使用它;如果时间不一样,表示缓存已经更新。
3、如果时间不一致的话,说明缓存已经更新了。此时服务器会返回最新的页面给客户端。
4、如果客户端请求的数据,本地服务器没有的话,则本地服务器会向后端原始服务器请求,并将请求的结果缓存在本地服务器上,然后再将响应的结果返回给客户端。这样客户端可以将返回的数据缓存在客户端浏览器上。
通过请求时携带的header “If-None-Match”判断缓存数据的新鲜度的实现机制:
这种方式其实和上述方式原理是一样的,只不过她们两携带的header参数不一样,检查的header参数也不一样。其原理为:当客户端第一次发起请求时,web服务器会为该请求生成的数据生成一个Etag首部,并且每当数据发生改变时,web服务器都会为它生成一个ETag首部。然后将这个Etag首部返回给客户端,且被客户端保存在本地。当客户端下次发送请求时会在请求首部添加Etag首部,web服务器收到请求后,检查web服务器上的该内容的ETag和请求报文中的ETag是否一致;如果一致表示请求的内容没有被修改,则web服务器会返回一个“304 Not Modified “ 信息给客户端,告诉客户端你所请求的数据没有被修改,你可以使用你自己本地的数据。如果ETag值不一致,则说明请求的数据已经更新,客户端的缓存内容失效。然后服务器会将最新的内容返回给客户端。
从上面看出,两种方式都可以判断缓存数据的新鲜度的,但是哪种方式更加精确呢?
其实第二种方式通过对比ETag首部来判断缓存数据的新鲜度比第一种通过数据的最近一次修改时间判断缓存数据的新鲜度更加的精确。为什么呢?这是因为第一种方式它通过数据的最近一次时间来判断缓存数据的新鲜度,它所能够精确的时间范围仅仅到秒而已。也就是说,当web服务器上的数据修改在秒以内完成的话,则这种判断方式将会导致错误。这样,客户端本地缓存的数据和web服务器上的数据将会不一致。而通过对比ETag首部则不一样,一点web服务器上的数据发生改变,则ETag值也一定会发生改变。所以第二种方式很好了解决了第一种方式的漏洞,比第一种方式判断的更加精确。
http的请求流程
客户端第一次请求流程如下:
客户端下次请求流程为:
http的相关缓存首部参数
1、Expires:用来定义web对象的过期日期或时间,通常为GMT格式。Expires是http 1.0的东西,现在浏览器默认使用的是http 1.1,所有它的作用基本忽略。不过Expires有一个缺点就是它的过期时间使用的是绝对时间,如果客户端和服务器时间不同步(或跨时区),则会导致误差。在http 1.1中使用Cache-Control:max-age替代了。
2、Cache-Control:这是所有的缓存机制必须遵守的缓存指示。它有许多子命令,分别如下:
public:响应被缓存,该缓存作为公共缓存,可以在多个用户之间共享
private:响应被缓存,只不过该缓存只能作为私有缓存,不能被多个用户所共享
no-cache:表示不使用浏览器缓存,但可以存储,在重新验正数据有效性之前不能用于响应客户端请求,且请求数据从服务器返回)
no-store:表示数据不能存储(存储和缓存不是一个意思),一般用于敏感文件。
max-age:定义缓存的有效时长。它比Expires的优先级高,也就是说max-age设定的时间会忽略Expires中设定的时间
must-revalidate:如果缓冲数据过期,必须发送到服务器端重新进行验证
3、Cache-Control 是关于浏览器缓存的最重要的设置因为它覆盖其他设置,比如 Expires 和 Last-Modified。另外由于浏览器的行为基本相同这个属性是处理跨浏览器缓存问题的最有效的方法。
4、Etag:响应首部,用于在响应报文中为某web资源定义版本标识符;
5、Last-Mofified:响应首部,用于回应客户端关于Last-Modified-Since请求,以通知客户端其请求的web对象最近一次的修改时间;
6、If-Modified-Since:条件式请求首部,如果在此请求首部指定的时间后其请求的web内容发生了更改,则服务器响应更改后的内容,否则,则响应304(not modified);
7、If-None-Match:条件式请求首部,web服务器会为某web对象定义一个ETag首部,,并将其返回给客户端,客户端会将该首部保存在本地。当一次请求时,客户端会携带该请求首部,服务器端收到后,对比某web对象请求报文中的ETag和服务器端的ETag是否一样,如果一样,表示缓存没有更新,则返回304(not modified);否则,将返回服务器端最新的数据给客户端。
8、Vary:响应首部,告诉代理服务器缓存两种版本的资源:压缩和非压缩,这有助于避免一些公共代理不能正确地检测Content-Encoding标头的问题。
9、Age:缓存服务器可以发送的一个额外的响应首部,用于指定响应的有效期限;浏览器通常根据此首部决定内容的缓存时长;如果响应报文首部还使用了max-age指令,那么缓存的有效时长为“max-age减去Age”的结果;
本文出自 “linux学习之路” 博客,请务必保留此出处http://xslwahaha.blog.51cto.com/4738972/1631348
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。