缓存
    
    是指代理服务器或客户端磁盘内保存的资源副本。利用缓存可减少对服务器的访问,因此也就节省了通信流量和通信时间。
    
    浏览器缓存是为了节约资源,并且可以加速浏览网站的速度,当用户第一次访问网页的时候,浏览器在用户磁盘上对请求的文档进行保存,当第二次访问的时候,就会从本地直接显示,从而提高了页面的访问速度。
    
    浏览器缓存的优点:
   
- 减少了冗余的数据传输,节省了网费;
- 减少了服务器的负担,大大提升网站的性能;
- 加快客户端加载网页的速度;
    浏览器缓存分为
    
     强缓存
    
    和
    
     协商缓存
    
    。
   
- 浏览器进行资源请求时,会判断请求头是否命中强缓存,如果命中,直接从本地读取缓存,不会向服务器发送请求。
- 当强缓存没有命中时,会发送请求到服务端,判断协商缓存是否命中,如果命中,服务器将请求返回,不会返回资源,告诉浏览器从本地读取缓存;如果不命中,则服务器直接返回资源。
    区别:
    
    强缓存命中,不会请求服务器,直接请求缓存;协商缓存命中,会请求服务器,不会返回内容,然后读取缓存。
   
    
    
    from memory cache 和 from disk cache 的区别:
   
    
     from memory cache
    
    :字面理解是从内存中,这个资源是直接从内存中拿到的,不会请求服务器,一般是已经加载过该资源且缓存在了内存中,当关闭该页面时,该资源就被内存释放掉了,再次重新打开相同页面是,不会出现 from memory cache 的情况。
    
    
     from disk cache
    
    :这个资源是从磁盘当中取出的,也是在之前的某个时间加载过该资源,不会请求服务器,但是此资源不会随着该页面的关闭关闭而释放掉,因为此资源是存在硬盘中的,下次打开仍会from disk cache。
   
    
    
    一、强缓存
   
    强缓存,利用HTTP的返回头中的expires和cache-control两个字段来控制,用来表示资源的缓存时间(缓存的有效期)。
    
    这种方法会有一个固定时间,但是如果服务器数据进行了更新,而强缓存的有效期还没有过期的话,则数据无法更新。
   
    
    
    Expires
   
该字段是http1.0时的规范,它的值是GMT格式的绝对时间,浏览器进行第一次请求时,服务器会在返回头部加上Expires,下次请求,如果在这个时间之前就命中缓存。
    
    
    Cache-Control
   
该值是利用max-age判断缓存的生命周期,是以秒为单位,如果在生命周期时间内,则命中缓存。
    
    
    二、协商缓存
   
    协商缓存,由服务器来确定缓存资源是否可用,所以客户端与服务端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问。
    
    利用 Last-Modified,If-Modified-Since 和 ETag,If-None-Match 来实现。
   
    
    
    Last-Modified,If-Modified-Since
   
    
     Last-Modified
    
    :表示为实体头部部分,response返回,表示资源的最后更新时间;
    
    
     If-Modified-Since
    
    :通过比较两次的时间来判断资源在请求期间是否有修改,如果没有修改,则命中协商缓存,浏览器从缓存中读取资源,如果没有命中,资源有修改过,则返回新的Last-Modified时间和服务器资源。
   
    
    
    ETag,If-None-Match
   
某些情况下仅判断最后修改日期来验证资源是否改动是不够的的:
- 存在周期性重写某些资源,但资源实际包含的内容并无变化;
- 被修改的信息并不重要,如注释等;
- Last-Modified 无法精确到毫秒,但有些资源更新频率有时会小于一秒。
    
     ETag
    
    :为响应头部字段,表示资源内容的唯一标识,随服务器response返回;
    
    
     If-None-Match
    
    :服务器比较请求头中的 If-None-Match 和当前资源中的 etag 是否一致,来判断资源是否修改过,如果没有修改,则命中缓存,浏览器从缓存中读取资源,如果修改过,服务器会返回新的etag,并返回资源。
   
    
    
    浏览器第一次请求时:
   
     
   
    
    
    浏览器在后续进行请求时:
   
     
   
    
     强缓存和协商缓存的区别
    
    :
   
| 缓存类型 | 获取资源形式 | 状态码 | 发送请求到服务器 | 
|---|---|---|---|
| 强缓存 | 从缓存取 | 200(from cache) | 否,直接从缓存获取 | 
| 协商缓存 | 从缓存取 | 304(Not Modified) | 是,通过服务器来告知缓存是否可用 | 
 
