7.8 新鲜度详细算法

本节适用于那些研究缓存内部机制的人。为了便于说明 HTTP 规范中的内容,我们使用了 Perl 伪代码。如果对计算缓存过期时间的公式中那些繁复的细节不感兴趣的话,可以跳过这一节。

1. 使用期和新鲜生存期

  • 为了分辨已缓存文档是否足够新鲜,缓存只需要计算两个值:已缓存副本的使用期(age),和已缓存副本的新鲜生存期(freshness lifetime)。
  • 如果已缓存副本的时长小于新鲜生存期,就说明副本足够新鲜,可以使用。用 Perl 表示为:
    $is_fresh_enough = ($age < $freshness_lifetime);
  • 文档的使用期:就是自从服务器将其发送出来(或者最后一次被服务器再验证)之后 “老去”的总时间。(记住,服务器上总是有所有文档的最新版本)
  • 缓存可能不知道文档响应是来自上游缓存,还是来自服务器的,所以它不能假设文档是最新的。它必须根据显式的 Age 首部(优先),或者通过对服务器生成的 Date 首部的处理,来确定文档的使用期。
  • 文档的新鲜生存期:表明已缓存副本在经过多长时间之后,就会因新鲜度不足而无法再向客户端提供了。新鲜生存期考虑了文档的过期日期,以及客户端可能请求的任何新鲜度覆盖范围。
  • 有些客户端可能愿意接受稍微有些过期的文档(使用 Cache-Control: max-stale 首部)。有些客户端可能无法接受会在近期过期的文档(使用 Cache-Control: min-fresh 首部)。缓存将服务器过期信息与客户端的新鲜度要求结合在一起,以确定最大的新鲜生存期。

2. 计算使用期

  • 响应的使用期就是服务器发布响应(或服务器对其进行了再验证)之后经过的总时间。
  • 使用期包含了响应在因特网路由器和网关中游荡的时间,在中间节点缓存中存储的时间,以及响应在你的缓存中停留的时间。
# 使用期计算的perl伪代码
# HTTP/1.1 使用期计算算法计算了已缓存文档的总体使用期
$apparent_age = max(0, $time_got_response - $Date_header_value); 
$corrected_apparent_age = max($apparent_age, $Age_header_value); 
$response_delay_estimate = ($time_got_response - $time_issued_request);
$age_when_document_arrived_at_our_cache = $corrected_apparent_age + $response_delay_estimate; 
$how_long_copy_has_been_in_our_cache = $current_time - $time_got_response;

$age = $age_when_document_arrived_at_our_cache + $how_long_copy_has_been_in_our_cache;
  • HTTP 使用期计算的基本概念:响应到达缓存时,缓存可以通过查看 Date 首部或 Age 首部来判断响应已使用的时间。缓存还能记录下文档在本地缓存中的停留时间。把这些值加在一起,就是响应的总使用期。
  • HTTP 用一些魔法对时钟偏差和网络时延进行了补偿,但基本计算非常简单:
    $age = $age_when_docum
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值