浅析浏览器缓存( 二 )


  • max-age:max-age指令控制资源的有效期,值为时间长度,如图:

浅析浏览器缓存

文章插图
 
  •  
  • 当客户端发送的请求中包含max-age指令时,浏览器会向服务器确认缓存的有效性,如果判定缓存资源的缓存时间数值比指定的时间数值小,那么客户端就接收缓存资源,当指定max-age值为0时,通常会向服务器发送请求
  • 当服务器返回的响应中包含max-age指令时,表示这段时间内,响应由缓存控制,浏览器不会再向服务器确认资源的有效性,而是直接返回缓存
  • s-maxage:s-maxage指令的功能和max-age指令的相同,不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器(代理服务器),s-maxage的优先级高于maxage,当s-maxage未过期时,会向公共缓存服务器请求缓存
  • public指令与private指令:当使用public指令时,则表示此缓存是公有缓存,可以被其他用户使用,当使用private指令时,表示该缓存时私有缓存,只有在特定用户请求时才会返回缓存
  • no-cache:防止从缓存中返回过期资源,当客户端请求中包含no-cache指令,表示客户端将不会接收缓存过的响应,缓存服务器必须把客户端请求转发给源服务器,当服务器返回的响应中包含no-cache指令,缓存服务器不能对资源进行缓存,存储在本地缓存区中缓存在与源服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用
  • no-store:不使用任何缓存,直接向源服务器请求下载内容
协商缓存
协商缓存就是强制缓存失效后,浏览器浏览器携带缓存标识向服务发起请求,由服务器更具缓存标识决定是否返回缓存,主要有两种情况:
  • 如果服务端提示资源未改动,资源会被重定向到浏览器缓存,这种情况下对应的网络状态码为304,如图:
  • 协商缓存失败,资源更新了,重新返回请求结果,这种情况下对应的网络状态码为200
接下来介绍和协商缓存相关的头部字段:
Last-Modified/If-Modified-since
Last-Modified指明资源最终修改的时间,值为一个时间戳,如图:
浅析浏览器缓存

文章插图
 
当缓存要对已缓存的文档进行再验证时,请求头中就会包含一个If-Modified-since首部,其携带有此资源最后修改的时间戳,如图:
浅析浏览器缓存

文章插图
 
如果在此期间内容被修改,最后的修改日期就会有所不同,源服务器就会返回新的内容重新响应,否则就会返回304,重定向到浏览器缓存 。
  • 使用Last-Modified存在两个弊端:我们打开了文件,但是并没有修改文件内容,服务器还是会认为我们修改了这个文件,Last-Modified会被更新,下次请求时会重新响应
  • If-Modified-since只能感应以秒为最小单位的时间差,当改动文件速度过快,小于1s时,无法感知文件变化,导致应该重新请求时,拉到缓存资源
由于这些缺陷HTTP1.1出现了Etag/If-None-Match
Etag/If-None-Match
ETag能告知客户端实体标识,它是一种可将资源以字符串形式做唯一标识的方式 。服务器会为每份资源分配对应的ETag值,当资源更新ETag值也会更新,如图:
浅析浏览器缓存

文章插图
 
当我们下次请求时,请求头里会带上一个If-None-Match字符串提供服务端对比,如图:
浅析浏览器缓存

文章插图
 
如果服务器上的标签已经发生了变化,服务器会在一个200响应中返回新的内容以及新的ETag,否则返回304重定向到缓存HTTP缓存决策
浅析浏览器缓存

文章插图
 
此图源自google,清楚展示了HTTP Cache决策的过程,对上面介绍的缓存过程做了一个完美的总结Push Cache
Push Cache指HTTP2在server push阶段存在的缓存,是HTTP2 session的一部分,不是一个持久化的缓存,当session结束时,缓存也会随之结束,不同的页面只要共享了同一个HTTP2连接,那么它们就可以共享同一个Push Cache,如果你对Push Cache还有更多的兴趣,这里提供三篇文章供你阅读:
  • HTTP/2 push is tougher than I thought
  • A Tale of Four Caches
  • HTTP2 Server Push 的研究
总结
此篇文章记录总结了浏览器缓存相关的一些知识点,是个人最近对缓存知识的一个总结,希望对大家也能有所帮助 。


推荐阅读