一、 强缓存,不向服务器发请求,直接从本地硬盘(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还有如下几个经常使用的值:网站
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
看了这么多不知道你糊涂没,下面有两张图,经过这两张图,你能对浏览器的缓存策略有一个新的认识
cdn缓存就是在浏览器和服务器间增长的一层缓存,缓存一些html、图片、css、xml等静态资源。
无cdn:
用户在浏览网站的时候,浏览器可以在本地保存网站中的图片或者其余文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载所有的文件,减小了下载量意味着提升了页面加载的速度。
有cdn:
若是中间加上一层CDN,那么用户浏览器与服务器的交互以下:
客户端浏览器先检查是否有本地缓存,是否过时,若是过时,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过时,若是没有过时,则直接响应用户请求,此时一个完成http请求结束;若是数据已通过期,那么CDN还须要向源站发出回源请求(back to the source request),来拉取最新的数据。
4、不一样的浏览器操做对应的缓存操做
浏览器缓存刷新