zoukankan      html  css  js  c++  java
  • 【转载】掌握 HTTP 缓存——从请求到响应过程的一切(上)

    作者:Ulrich Kautz 
    编译:胡子大哈

    翻译原文:http://huziketang.com/blog/posts/detail?postId=58b77935204d50674934c3ad 
    英文原文:Mastering HTTP Caching - from request to response and everything

    转载请注明出处,保留原文链接以及作者信息

    学习笔记


    HTPP 响应缓存头:

    1、新版本指的是 HTTP/1.1

    2、而旧版本指的是 HTTP/1.0

     

    ETag:它是文档版本的标识符


     通常是内容的 MD5 值,不过它也可以包含其他内容,代表的是文档的版本/日期,如: 1.0 或者 2017-02-27。这里注意一点是,它必须用双引号括起来,如:ETag: "d3b07384d113edec49eaa6238ad5ff00"。

    客户端请求了http://doc.tinywan.com:8038/cache2.txt,接着服务端返回了如下的响应内容:

    第一次访问:

    在响应里面,有两个有意思的头标识:

    【1】一个是 ETag,内容的 MD5值。

    【2】一个是 Last-Modified,这是 cache2.txt 文件最后一次被修改的时间。

    这里就是二次验证起作用的地方:当客户端在很短的时间内再次访问上面的 URL,客户端浏览器会使用 If-* 请求头。如 If-None-Match 检查 ETag 的内容是否有改变。也就是说,如果 ETag 发生变化,客户端接收到的一个完整的新响应;如果 ETag 没变化,客户端接收到的是一个表明内容没变化的标识。

     第二次访问:

    正如上面所展示的,这次服务器的响应里面不是 200 ok,而是304 Not Modified,这就是说它略过包体部分,让客户端直接去自己的缓存里拿数据。

    我们修改cache2.txt文件

    注意:以上红线划出来的地方,已经发生变化了

    在处理上面那个cache2.txt 静态文件的例子时,客户端还可以使用 If-Modified-Since:Sun, 24 Sep 2017 05:27:44 GMT 来达到同样的效果(返回 304 响应)。这对于静态文件来说也很好用,因为响应头中的 Last-Modified 标识是根据服务器磁盘上的“更改时间戳”自动生成的。然而,“更改时间戳”对于动态文件通常没什么用,因为动态生成文件频繁更新,时间戳很难确定。我们都知道,你最想缓存起来的是内容,生成内容的代价是最大的,所以 ETag 头是更好的选择。

     Cache-Control头


     

    Cache-Control 头相对来讲难一些。两个原因:

    第一,Cache-Control 既可以用于请求头,也可以用于响应头。本文中着重讨论响应头,因为这是开发者所必须要掌握的。

    第二,它控制着两个缓存:本地缓存(又称私有缓存)和共享缓存。

    本地缓存,是指在客户端本地机器中的缓存。站在开发者的角度,它并不完全受你的控制,通常浏览器会自己决定是否把某些内容放到缓存中,这意味着:不要依赖于本地缓存。用户也可能在关闭浏览器的时候清理所有缓存,而你并不知道有这样的操作。除非你监测到了某个用户的流量不断上涨,导致缓存内容迅速失效,这时候你才会意识到。

    共享缓存也就是本文所介绍的:处于客户端和服务器之间的缓存。即 CDN。你对共享缓存拥有绝对的控制,应该好好地利用它。

    现在我们来用一些代码作为示例深入学习一下。

    1. Cache-Control: public max-age=3600
    2. Cache-Control: private immutable
    3. Cache-Control: no-cache
    4. Cache-Control: public max-age=3600 s-maxage=7200
    5. Cache-Control: public max-age=3600 proxy-revalidate

    首先是缓冲能力,它关注的是缓存到什么地方,和是否应该被缓存。他的几个重要的属性是:

    • private表示它只应该存在本地缓存;
    • public表示它既可以存在共享缓存,也可以被存在本地缓存;
    • no-cache表示不论是本地缓存还是共享缓存,在使用它以前必须用缓存里的值来重新验证;
    • no-store表示不允许被缓存。

    第二个是过期时间,很显然它关注的是内容可以被缓存多久。它的几个重要的属性是:

    • max-age=<seconds>:设置缓存时间,设置单位为秒。本地缓存和共享缓存都可以;
    • s-maxage=<seconds>:覆盖 max-age 属性。只在共享缓存中起作用。

    最后一个是二次验证,表示精细控制。它的几个重要属性是:

    • immutable表示文档是不能更改的。
    • must-revalidate表示客户端(浏览器)必须检查代理服务器上是否存在,即使它已经本地缓存了也要检查。
    • proxy-revalidata表示共享缓存(CDN)必须要检查源是否存在,即使已经有缓存。

    通过上面的具体解释,现在再来描述上面 Cache-Control 的那段代码所表达的意思就好理解多了:

    1. 本地缓存和 CDN 缓存均缓存 1 小时;
    2. 不能缓存在 CDN,只能缓存在本地。并且一旦被缓存了,则不能被更新;
    3. 不能缓存。如果一定要缓存的话,确保对其进行了二次验证;
    4. 本地缓存 1 小时,CDN 上缓存 2 小时;
    5. 本地和 CDN 均缓存 1 小时。但是如果 CDN 收到请求,则尽管已经缓存了 1 小时,还是要检查源中文档是否已经被改变。

     

     

     

     

     

     

     

     


     

  • 相关阅读:
    第一个django
    windows安装django
    Uva 705
    UVa 10034
    ACM中出现RuntimeError的原因及可能的解决办法
    [转载]最小生成树-Prim算法和Kruskal算法
    Uva 10305 Ordering Tasks
    Uva 793 Network Connections
    Uva 10608 Friends
    Uva 10583 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/tinywan/p/7586629.html
Copyright © 2011-2022 走看看