浏览器缓存:强缓存和协商缓存

一、 强缓存,不向服务器发请求,直接从本地硬盘(from disk cache/from memory cache)或者内存中获取css

二、协商缓存,向服务器发出验证,若是资源无更改,不从新返回资源内容,资源内容从本地获取,,须要刷新command+rhtml

三、若是须要从服务器直接获取,须要强制刷新,就是所谓的command+shift+r算法

1、强缓存浏览器

是利用HTTP响应报文中的Expires和Cache-Control两个字段来控制的,用来表示资源的缓存时间。缓存

Expires:该字段是HTTP/1.0时的规范,它的值是一个绝对时间的GMT格式的时间字符串,如Expires: Mon, 06 Feb 2017 08:26:48 GMT。这个时间表明资源的失效时间,在此之间,即命中强缓存。可是它有一个明显的缺点,当客户端与服务器时间出现较大误差,就会出现混乱。服务器

Cache-Control:为了解决Expires出现的问题,HTTP/1.1添加了Cache-Control。主要是利用max-age来进行判断,它是一个相对时间,如Cache-Control:max-age=600,表明着资源的有效期是600秒(10分钟)。除了max-age外,Cache-Control还有如下几个经常使用的值:网站

  • no-cache:不适用强缓存。须要使用缓存协商。
  • no-store:禁止浏览器缓存,不适用强缓存和缓存协商,每次请求资源都须要发送HTTP到服务器,每次都须要下载完整的资源。
  • public:能够被全部的用户缓存,包括客户端和CDN等中间代理服务器。
  • private:只容许客户端缓存,不容许CDN等中间代理服务器对其缓存
Cache-Control与Expires能够在服务端配置同时启用,可是Cache-Control的优先级高于Expires
 
2、协商缓存
  须要由服务器来肯定客户端缓存资源是否可用。这主要涉及Header中两组字段:Last-Modified/If-Modified-Since或ETag/If-None-Match,这两组字段都是成对出现的。若第一次的 响应头没有Last-Modified或ETag,则后续的 请求头部也不会有If-Modified-Since或If-None-Match。

  Last-Modified/If-Modified-Since:浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modified,它是一个时间标识该资源的最后修改时间。当浏览器再次请求该资源时,HTTP请求头部会带上If-Modified-Since,该值为上次响应报文头部的Last-Modified的值,服务器接收到If-Modified-Since,会根据资源的最后修改时间来判断是否命中协商缓存,若是命中,返回304(Not Modified),而且不会返回Last-Modified和无响应body。不然返回200,而且返回Last-Modified和有响应的body。lua

  ETag/If-None-Match:它们的值不是一个时间标识,而是一个校验码。ETag能够保证每个资源都是惟一的资源变化都会致使ETag变化,服务器根据接收到的If-None-Match来判断是否命中协商缓存。可是当服务器返回304的时候,因为ETag从新生成过(ETag的算法,没有明确规定,能够每次生成,也能够生成后存储起来),响应头部也会带上ETag,即便它跟以前的没有变化。spa

为何要有ETag?不是已经有Last-Modified吗。.net

  • 一些文件或许会周期性的修改,可是它的内容没有变化(只是改变了修改时间),这个时候咱们并不但愿客户端认为这个文件修改了,而从新获取。
  • 某些文件在1秒内修改了N次,用If-Modified-Since没法进行区分,由于If-Modified-Since的时间最小单位是秒。
  • 某些服务器不能精确的获得文件的最后修改时间。
  • Last-Modified和ETag能够一块儿使用,可是ETag的优先级大于Last-Modified,当ETag相同的状况下,才会继续比较Last-Modified,最后才决定是否返回304。

看了这么多不知道你糊涂没,下面有两张图,经过这两张图,你能对浏览器的缓存策略有一个新的认识

3、谈下浏览器缓存和CDN缓存的关系

cdn缓存就是在浏览器和服务器间增长的一层缓存,缓存一些html、图片、css、xml等静态资源。

cdn:

    用户在浏览网站的时候,浏览器可以在本地保存网站中的图片或者其余文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载所有的文件,减小了下载量意味着提升了页面加载的速度。

cdn:

  若是中间加上一层CDN,那么用户浏览器与服务器的交互以下:

  客户端浏览器先检查是否有本地缓存,是否过时,若是过时,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过时,若是没有过时,则直接响应用户请求,此时一个完成http请求结束;若是数据已通过期,那么CDN还须要向源站发出回源请求(back to the source request),来拉取最新的数据。

4、不一样的浏览器操做对应的缓存操做

 

 

浏览器缓存刷新 

 


1.  在地址栏中输入网址后按回车或点击转到按钮

 

浏览器以最少的请求来获取网页的数据,浏览器会对全部没有过时的内容直接使用本地缓存,从而减小了对浏览器的请求。因此,Expires,max-age标记只对这种方式有效。

 

2.  按F5或浏览器刷新按钮

 

浏览器会在请求中附加必要的缓存协商,但不容许浏览器直接使用本地缓存,它可以让 Last-Modified、ETag发挥效果,可是对Expires无效。

 

3.  按Ctrl+F5或按Ctrl并点击刷新按钮

 

这种方式就是强制刷新,总会发起一个全新的请求,不使用任何缓存。

 

参考:
一、http://blog.csdn.net/kikikind/article/details/6266101
二、http://blog.csdn.net/heluan123132/article/details/72885990
三、http://blog.csdn.net/lu123535884/article/details/51489951
四、http://www.cnblogs.com/slly/p/6732749.html
相关文章
相关标签/搜索