美文网首页
7.8 keep copies fresh 保持缓存内容新鲜

7.8 keep copies fresh 保持缓存内容新鲜

作者: 恒星的背影 | 来源:发表于2019-06-27 12:28 被阅读0次

    客户端缓存的副本可能会与服务器上的文档不一致,因为这些文档可能会随时间发生变化。所以缓存的数据与服务器数据保持一致是重要的,HTTP有一些机制来做这件事。

    1 文档过期
    使用 Cache-ControlExpires 可以给文档添加一个过期时间,缓存过期之前,客户端可以直接使用缓存,而无需和服务端联系。缓存一旦过期,就需要询问服务端文档是否修改过,如果修改过,则需要获取一份新的副本。

    2 过期日期和使用期
    Cache-Control 使用相对时间;Expires 使用绝对时间,这依赖于计算机时钟的正确设置。

    3 服务器再验证
    验证时如果文档内容没有变化,那么只需要用新的 response header 更新过期时间即可。

    4 用条件方法进行再验证
    HTTP条件方法可以高效地实现再验证,这种方式将新鲜度检测和获取对象结合成了单个请求。
    If-Modified-Since: <date> : 如果在指定日期之后文档修改过,就执行请求的方法
    If-None-Match: <tags> : 如果已缓存的 ETag 与服务器文档中的 ETag 不同,就执行请求的方法

    5 If-Modified-Since: Date 再验证
    如果文档没有变化,返回 304 响应报文。
    If-Modified-Since 可以和 Last-Modified 配合,验证时使用 Last-Modified 给出的日期。

    6 If-None-Match: Entity Tag 再验证
    ETag 是版本标识符。有些场景只使用最后修改日期进行再验证是不够的,比如修改的内容并不重要,不需要缓存更新。
    当发布者对文档修改时,可以修改文档的ETag来说明这个新的版本。

    7 强弱验证器
    w/ 标记弱验证器,ETag: W/"v2.6"

    8 何时用 Entity Tags 和 Last-Modified Dates
    如果服务器只提供了Last-Modified值,那就用If-Modified-Since验证;
    如果服务器提供了ETag值,就用ETag验证;
    如果两者都提供了,只有两者都满足时才能返回 304 Not Modified

    总结:
    服务器给出Cache-ControlExpires 响应头,表示文档过期时间。过期之前浏览器直接使用缓存的内容,而不重新发出请求。
    过期之后根据服务器给的Last-ModifiedETag 相应头,客户端使用 If-Modified-Since: <date>If-None-Match: <tags> 发出请求,如果文档未发生变化,返回 304 Not Modified,否则返回新的文档。

    参考资料:
    《HTTP权威指南》

    相关文章

      网友评论

          本文标题:7.8 keep copies fresh 保持缓存内容新鲜

          本文链接:https://www.haomeiwen.com/subject/iydhcctx.html