-since、Etag/If-Match、cache-control/expires浏览器缓存位置分为四种,它们的优先级顺序如下:ServiceWorker、MemoryCache、DiskCache、PushCache,当以上四种缓存都没有时位置中的缓存被命中,向服务器发出请求。ServiceWorker:不懂;PushCache:没看懂;MemoryCache:是内存中的缓存,特点是容量小,读取效率高,持久化时间短。它将随着流程的发布而发布。当缓存低、小资源时,优先使用MemoryCache;DiskCache:磁盘中的缓存,特点是容量大、读取慢、持久化长。任何资源都可以存入磁盘,在内存中使用当速率高,大容量资源被缓存时,会优先使用DiskCache;浏览器缓存策略分为两种,强缓存和协商缓存:用户发送的请求强制缓存,直接从客户端缓存中获取请求,不向服务器发送请求,不与服务器交互.协商缓存用户发送的请求被发送到服务器,服务器决定是否从缓存中获取资源。可以用下面的流程图来概括浏览器的缓存机制:浏览器的缓存主要是缓存静态资源,比如图片、文件、js等,当用户发起请求时,浏览器首先执行步骤(a)检查是否有缓存。如果我们使用的是谷歌浏览器,也可以在地址栏输入chrome://cache/,查看是否缓存了你发起的请求链接。列表。如果想主动清除缓存,也可以在请求头信息中加入“Cache-Control:no-store”来禁用缓存。下一次是缓存列表中打开的缓存:如果浏览器中有缓存,则执行步骤(b)检查缓存是否过期,主要通过响应头信息中的缓存标识字段Expires或Cache-Control存储在缓存中以验证缓存资源是否过期。expires是服务器在响应请求时用来指定资源的过期时间。Cache-Control用于服务端指定资源是否需要被浏览器缓存,以及响应请求时缓存的有效时间。Cache-Control的主要取值如下:缓存的及时性由max-age决定。在max-age设置的时间内发起对当前资源的访问后,使用浏览器内部缓存!超过max-age设置的时间后,浏览器会选择使用协商缓存。响应头信息中的no-cahce表示不使用强制缓存,直接进入协商缓存。请求头信息中的no-cache表示应该重新获取请求。cache和max-age=0的作用和请求头中的max-age=0是一样的:都需要在使用cache之前进行验证。Expires是HTTP1.0的字段,Cache-Control是HTTP1.1的字段。当Expires和Cache-Control同时存在时,Cache-Control的优先级高于Expires。为了保证浏览器兼容性,后端一般会将这两个字段同时返回给前端。如果命中缓存(即缓存资源存在且缓存资源未过期),浏览器会响应HTTPStatusCode200,直接使用缓存资源作为返回结果,无需发起HTTPrequest,即强制缓存;如果有缓存资源但缓存资源已经过期,则进入下一步协商缓存。与(c)协商缓存相关的缓存标识字段是Last-Modified和Etag。Last-Modified是服务器在响应请求时用来表示资源的最后修改时间。与之对应的是If-Modified-Since字段。在缓存协商过程中,浏览器发送的HTTP请求头中会携带If-Modified-Since字段,即缓存资源的Last-Modified属性的值。当服务器收到带有If-Modified-Since的请求时,它会将If-Modified-Since的值与所请求资源的最后修改时间进行比较。如果相同,说明该资源没有新的修改,则响应HTTPStatusCode304,浏览器会继续使用缓存的资源;如果最后修改时间比较新,说明资源已经被修改,则响应HTTPStatusCode200,返回最新的资源。Etag是服务器在响应请求时用来描述服务器端资源的唯一标识。与之对应的是If-None-Match字段。在缓存协商过程中,浏览器发送的HTTP请求头中会携带If-None-Match字段,即缓存资源Etag属性的值。当服务器收到带有If-None-Match的请求时,它会将If-None-Match的值与所请求资源的唯一标识符进行比较。如果相同,说明该资源没有新的修改,则响应HTTPStatusCode304,浏览器会继续使用缓存的资源;如果没有,说明资源已经被修改,则响应HTTPStatusCode200,返回最新的资源。Last-Modified是HTTP1.0的字段,Etag是HTTP1.1的字段。当Last-Modified和Etag同时存在时,Etag的优先级高于Last-Modified。Etag的出现主要是为了解决Last-Modified的问题。最后浏览器会根据Expires和Cache-Control判断是否缓存新请求的资源。<结束>
