作为程序员,HTTP缓存这一块还是需要了解一下的( 二 )

  • no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验 。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处);
  • no-store — 强制缓存在任何情况下都不要保留任何副本
  • must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的
  • proxy-revalidate — 和 must-revalidate 类似,除了他只对缓存代理服务器起作用
  • 4.3、Last-Modified/If-Modified-Since (协商缓存机制)
    • 通常服务器知道你所请求的数据的最后修改时间,并且 HTTP 为服务器提供了一种将最近修改数据连同你请求的数据一同发送的方法 。
    • 如果你第二次 (或第三次,或第四次) 请求相同的数据,告诉服务器上一次获得的最后修改日期:在请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期 。
    • 如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据没有改变” 。
    • 当服务器发送状态编码 304 时,不再重新发送数据 。所以当数据没有更新时,你不需要一次又一次地下载相同的数据
    • 兼容性 :所有现代的浏览器都支持 (last-modified) 的数据检查 。
    4.4、ETag/If-None-Match (协商缓存机制)
    • 作用: 没有变化时不重新下载数据
    • 工作方式 :
    • 1.Etag是上一次加载资源时,服务器返回的 response header,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成
    • 2.浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的 Etag 值放到 request header 里的 If-None-Match 里,服务器比较客户端传来的 If-None-Match 跟自己服务器上该资源的 ETag 是否一致
    • 3.如果服务器发现 ETag 匹配不上,那么直接以常规 GET 200 回包形式将新的资源(当然也包括了新的 ETag )发给客户端;如果 ETag 是一致的,则直接返回304知会客户端直接使用本地缓存即可 。
    五、几种缓存策略的对比5.1、两种强缓存机制对比 `Expires` VS `Cache-Control`
    • 差别不大,区别就是 Expires 是 HTTP1.0 的产物,而 Cache-Control 是 HTTP1.1 的产物
    • 优先级上,两者同时存在的话,Cache-Control 优先级高于 Expires ,Expires 更像是一种备选方案,在某些不支持 Cache-Control 的环境中发挥作用
    • 二者共同的弊端 就是这种强缓存的机制仅仅关心缓存是否超出或者超过某个过期时间,并不关心服务器端的资源是否已经更新,所以单纯使用这两种缓存策略会导致客户端拿到的资源不是最新的
    5.2、两种协商缓存机制对比 `Last-Modified/If-Modified-Since` VS `ETag/If-None-Match`
    • 精度上,ETag 要明显优于前者,Last-Modified/If-Modified-Since 策略的时间单位为秒,这就意味着在秒级的请求上,做不到真正的及时更新,但是 ETag 每次请求都会对其进行改变从而确保精度,并且在使用负载均衡的服务器上,各个服务器生成的 Last-Modified 也有可能不相同
    • 性能上,ETag 要逊于 Last-Modified/If-Modified-Since 策略,毕竟 Last-Modified/If-Modified-Since 策略只是记录时间,而 ETag 需要进行一步hash运算
    • 优先级上,服务器会优先考虑 ETag
    六、用户行为对缓存策略的影响
    【作为程序员,HTTP缓存这一块还是需要了解一下的】并不是所有的操作都会启用正常的缓存机制,在某些用户行为下,缓存机制是可以正常跳过的
    1. 地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制
    2. F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断
    3. ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源
    尾声既然选择了远方,那学就完了 。




    推荐阅读