第七章缓存

编程


1.冗余的数据传输:一些相同的字节会在网络中一遍遍地传输。缓存,就可以保留第一条服务器响应的副本,后继请求就可以由缓存的副本来应对了。
2.带宽瓶颈:很多网络为本地网络客户端提供的带宽比为远程 服务器提供的带宽要宽。客户端会以路径上最慢的网速访问服务器。 如果客户端从一个快速局域网的缓存中得到了一份副本,那么缓存就可以提高性 能——尤其是要传输比较大的文件时。
3.瞬间拥塞:很多人几乎同时去访问一个 Web 文档时,就会出现瞬间拥塞。由此造成的过多流量峰值可能会使网络和 Web 服务器产生灾难性的崩溃。
4.距离时延:
5.命中和未命中的
    (1)再验证
        缓存对缓存的副本进行再验证时,会向原始服务器发送一个小的再验证请求。如果内容没有变化,服务器会以一个小的 304 Not Modified 进行响应。
        If- Modified-Since 首部。将这个首部添加到 GET 请求中去,就可以告诉服务器,只有在缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象。
        • 再验证命中:如果服务器对象未被修改,服务器会向客户端发送一个小的HTTP 304 Not Modified 响应。
        • 再验证未命中: 如果服务器对象与已缓存副本不同,服务器向客户端发送一条普通的、带有完整内容的 HTTP 200 OK 响应。
        • 对象被删除:如果服务器对象已经被删除了,服务器就回送一个 404 Not Found 响应,缓存也会将其副本删除。
    (2)命中率:缓存提供服务的请求所占的比例被称为缓存命中率    
            对现在中等规模的 Web 缓存来说,40% 的命中率是很合理的。
    (3)字节命中率:缓存提供的字节在传输的所有字节中所占的比例。通过这种度量方式,可以得知节省流量的程度。
     (4) 区分命中和未命中的情况:客户端有一种方法可以判断响应是否来自缓存,就是使用 Date 首部。将响应中 Date 首部的值与当前时间进行比较,如果响应中的日期值比较早,客户端通常就可
         以认为这是一条缓存的响应。客户端也可以通过 Age 首部来检测缓存的响应,通过 这个首部可以分辨出这条响应的使用期
6.缓存的拓扑结构
    缓存可以是单个用户专用的,也可以是数千名用户共享的。专用缓存被称为私有缓 存(private cache)。共享的缓存被称为公有缓存(public cache)
    (1)公有代理缓存:公有缓存是特殊的共享代理服务器,被称为缓存代理服务器(caching proxy server),代理缓存会从 本地缓存中提供文档,或者代表用户与服务器进行联系
    (2)代理缓存的层次结构:
        实现层次化(hierarchy)的缓存是很有意义的,在这种结构中,在较小缓存中未命中的请求会被导向较大的父缓存(parent cache),由它来为剩下的那些 “提炼过的”流量提供服务。
    (3)网状缓存、内容路由以及对等缓存
        网状缓存中的代理缓存之间会以更加复杂的方式进行对话,做出动态的缓存通信决策,决定与哪个父缓存进行对话,或者决定彻底绕开缓存,直接连接原始服务器。
        这种代理缓存会决定选择何种路由对内容进行访问、管理和传送,因此可将其称为 内容路由器(content router)。
        网状缓存中为内容路由设计的缓存(除了其他任务之外)要完成下列所有功能。
            • 根据 URL 在父缓存或原始服务器之间进行动态选择。
            • 根据 URL 动态地选择一个特定的父缓存。
            • 前往父缓存之前,在本地缓存中搜索已缓存的副本。
            • 允许其他缓存对其缓存的部分内容进行访问,但不允许因特网流量通过它们的缓存。
7.缓存的处理步骤
    (1) 接收——缓存从网络中读取抵达的请求报文。
    (2) 解析——缓存对报文进行解析,提取出 URL 和各种首部。
    (3) 查询——缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)。
    (4) 新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。
    (5) 创建响应——缓存会用新的首部和已缓存的主体来构建一条响应报文。
    (6) 发送——缓存通过网络将响应发回给客户端。
    (7) 日志——缓存可选地创建一个日志文件条目来描述这个事务。
8.保持副本的新鲜
    (1)文档过期:通过特殊的 HTTP Cache-Control 首部和 Expires 首部,HTTP 让原始服务器向每个文档附加了一个“过期日期”,一旦已缓存文档过期,缓存就必须与服务器进行核对,询问文档是否被修改过,如果 被修改过,就要获取一份新鲜(带有新的过期日期)的副本。
    (2)过期日期和使用期:服务器用 HTTP/1.0+ 的 Expires 首部或 HTTP/1.1 的 Cache-Control: max-age 响应首部来指定过期日期,Cache-Control 首部使用的是 相对时间而不是绝对日期
    (3)服务器再验证:
        HTTP 协议要求行为正确的缓存返回下列内容之一:
        • “足够新鲜”的已缓存副本;
        • 与服务器进行过再验证,确认其仍然新鲜的已缓存副本;
        • 如果需要与之进行再验证的原始服务器出故障了,就返回一条错误报文 14;
        • 附有警告信息说明内容可能不正确的已缓存副本。
    (4)用条件方法进行再验证:HTTP 的条件方法可以高效地实现再验证。HTTP 允许缓存向原始服务器发送一个“条件 GET”,请求服务器只有在文档与缓存中现有的副本不同时,才回送对象主体。
        HTTP 定义了 5 个条件请求首部。对缓存再验证来说最有用的 2 个首部是 If- Modified-Since 和 If-None-Match。
    (5)If-Modified-Since:Date再验证
        If-Modified-Since 再验证请 求通常被称为 IMS 请求。只有自某个日期之后资源发生了变化的时候,IMS 请求才会指示服务器执行请求:
        • 如果自指定日期后,文档被修改了,If-Modified-Since 条件就为真,通常 GET 就会成功执行。携带新首部的新文档会被返回给缓存,新首部除了其他信息之外,还包含了一个新的过期日期。
        • 如果自指定日期后,文档没被修改过,条件就为假,会向客户端返回一个小 的 304 Not Modified 响应报文,为了提高有效性,不会返回文档的主体。这 些首部是放在响应中返回的,但只会返回那些需要在源端更新的首部。比如,Content-Type 首部通常不会被修改,所以通常不需要发送。一般会发送一个新的过期日期。
    (6)If-None-Match:实体标签再验证
        有些情况下仅使用最后修改日期进行再验证是不够的。
            • 有些文档可能会被周期性地重写(比如,从一个后台进程中写入),但实际包含的数据常常是一样的。尽管内容没有变化,但修改日期会发生变化。
            • 有些文档可能被修改了,但所做修改并不重要,不需要让世界范围内的缓存都重装数据(比如对拼写或注释的修改)。
            • 有些服务器无法准确地判定其页面的最后修改日期。
            • 有些服务器提供的文档会在亚秒间隙发生变化(比如,实时监视器),对这些服务器来说,以一秒为粒度的修改日期可能就不够用了。
        HTTP 允许用户对被称为实体标签(ETag)的“版本标识符” 进行比较。实体标签是附加到文档上的任意标签(引用字符串)。它们可能包含了文档的序列号或版本名,或者是文档内容的校验和及其他指纹信息。
    (7)什么时候应该使用实体标签和最近修改日期
        如果服务器回送了一个实体标签,HTTP/1.1 客户端就必须使用实体标签验证器。如果服务器只回送了一个 Last-Modified 值,客户端就可以使用 If-Modified-Since 验证。
9.控制缓存的能力
    (1)no-Store与no-Cache响应首部
        no-store 首部和 no-cache 首部可以防止缓存提供未经证实的已缓存对象:
        Pragma: no-cache 
        Cache-Control: no-store 
        Cache-Control: no-cache
        标识为 no-store 的响应会禁止缓存对响应进行复制。
        标识为 no-cache 的响应实际上是可以存储在本地缓存区中的。
    (2)max-age响应首部
        Cache-Control: max-age 首部表示的是从服务器将文档传来之时起,可以认为此文档处于新鲜状态的秒数。有一个 s-maxage 首部(注意 maxage 的中间没有连 字符),其行为与 max-age 类似,但仅适用于共享(公有)缓存:
        Cache-Control: max-age=3600 
        Cache-Control: s-maxage=3600
    (3)Expires响应首部:不推荐使用 Expires 首部,它指定的是实际的过期日期而不是秒数。
    (4)must-revalidate响应首部:如果原始服务器 希望缓存严格遵守过期信息,可以在原始响应中附加一个 Cache-Control: must- revalidate 首部。
        Cache-Control: must-revalidate
        如果在缓存进行 must-revalidate 新鲜度检查时,原始服务器不可用,缓存就必须返回一条 504 Gateway Timeout 错误。
    (5)试探性过期
        如果响应中没有 Cache-Control: max-age 首部,也没有 Expires 首部,缓存可以计算出一个试探性最大使用期。
        LM-Factor 算法是一种很常用的试探性过期算法,如果文档中包含了最后修改日期, 就可以使用这种算法。LM-Factor 算法将最后修改日期作为依据,来估计文档有多么易变。
    (6)客户端的新鲜度限制
        Web 浏览器都有 Refresh(刷新)或 Reload(重载)按钮,可以强制对浏览器或代理缓存中可能过期的内容进行刷新。Refresh 按钮会发布一个附加了 Cache- Control 请求首部的 GET 请求,这个请求会强制进行再验证,或者无条件地从服务器获取文档。Refresh 的确切行为取决于特定的浏览器、文档以及拦截缓存的配置。
10.设置缓存控制
    Apache Web 服务器
    (1)控制Apache的HTTP首部

以上是 第七章缓存 的全部内容, 来源链接: utcz.com/z/517784.html

回到顶部