这里的Age指的是响应头Age。以下内容有部分翻译,也有部分自己的理解。欢迎讨论。

我们用now表示当前主机的当前时间,用request_time表示缓存发起请求的时间,用response_time表示缓存收到响应的时间。

HTTP/1.1要求源server的每个响应都包括一个Date头信息。表示这个响应被源server创建的时间,我们用date_value表示这个Date头的值。

HTTP/1.1使用Age响应头表示响应从缓存中拿到时响应的寿命,我们用age_value表示Age头的值。

缓存中响应的寿命能够通过两种全然独立的方式计算:

1.        直接用response_time(缓存收到响应的时间)减去date_value(响应被创建的时间),假设为负数,用0替代。

2.        假设响应路径上的全部缓存实现了HTTP/1.1,则直接用age_value值。

但实际上,我们非常难保证响应路径上的全部缓存都实现了HTTP/1.1,所以。同一时候使用这两种方式。然后进行修正,结果会更可靠:

corrected_received_age= max(response_time - date_value, age_value);

到这里还没有完毕终于计算,corrected_received_age仅仅是缓存收到响应时,响应的寿命,没有考虑响应到下一个缓存或client的网络延迟时间。

由于网络会有延迟,在传输过程中寿命已经添加了。下一个缓存就得考虑这个因素。对于这个因素,HTTP/1.1採用了一种比較保守的计算方法。假设从请求发起到收到响应的时间就是网络延迟的时间(结果不一定就是实际经过的时间),用response_delay表示:

response_delay= response_time – request_time;

corrected_initial_age= corrected_received_age + response_delay;

response_delay一般指最后一个缓存到client的延误时间,假设响应路径上有多个缓存。不须要迭代。由于corrected_received_age是依据缓存收到响应的时间,已经减去了前面的网络延迟。

以上还仅仅是计算响应第一次出如今缓存中时已经拥有的寿命。响应一旦被缓存,就可能被多次使用,这个时候,响应的寿命就得由缓存来计算了。

我们用resident_time表示响应在缓存中贮存的时间。用current_age表示响应的当前寿命:

resident_time= now - response_time;

current_age= corrected_initial_age + resident_time;

假设响应路径中有缓存。请求终于受到的响应头Age相应的值是current_age。而不是server最初给的Age,由于这个值被缓存已经改动过了。

HTTP Cache怎样计算Age的更多相关文章

  1. 计算机系统原理:cache容量计算

    Cache容量计算例题: 假定主存地址位数为32位,按字节编址,主存和cache之间采用4-路组相联映射方式,主存块大小为4个字,每字32位,采用直写(Write Throght)方式和LRU替换策略 ...

  2. buffer和cache有什么本质区别

    在free命令展示机器的内存消耗情况,会像这样展示

  3. cache与SDRAM

    hugohong hugohong 本版等级:   #2 得分:20回复于: 2009-04-19 21:51:03 牛人说的,拿出来分享一下:cache是高速缓冲, 解决高速cpu和相对低速sdra ...

  4. 【转】UVa Problem 100 The 3n+1 problem (3n+1 问题)——(离线计算)

    // The 3n+1 problem (3n+1 问题) // PC/UVa IDs: 110101/100, Popularity: A, Success rate: low Level: 1 / ...

  5. Ehcache(2.9.x) - API Developer Guide, Searching a Cache

    About Searching The Search API allows you to execute arbitrarily complex queries against caches. The ...

  6. 把对象缓存到HttpRuntime.Cache里,你能安全地使用它吗?

    每每勤勤恳恳,思来想去,趁还有激情,先把它记录下来... 定义一个Stu的类: public class Stu { public string Name { get; set; } public i ...

  7. 使用Free命令查看Linux服务器内存使用状况(-/+ buffers/cache详解)

    free命令可选参数 -b,-k,-m,-g show output in bytes, KB, MB, or GB -h human readable output (automatic unit ...

  8. 计算hashCode通用计算公式

    1.java计算公式 @Override public int hashCode() { //设置初始值 ; //假设有效域为: name,age,idCardNo,incomeAnnual,sex, ...

  9. HTTP超文本传输协议-HTTP/1.1中文版

    摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...

随机推荐

  1. JDK源码学习笔记——Object

    一.源码解析 public class Object { /** * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用 */ private static native void ...

  2. 1.5 (SQL学习笔记)事务处理

    一.事务 1.1事务概念 事务处理可以用来维护数据库系统数据的完整性,它保证一组SQL语句要么全部都执行, 要么全部都不执行.(例如一批SQL语句,只要有一个执行失败就全部不执行,即回到失败前的状态 ...

  3. [原创]MyEclipse2014全手动实现反向工程---解决手动整合ssh时发生的、在hibernate反向工程的时候找不到项目名的问题

    1.在MyEclipse2014中新建两个Web Project项目,名字分别为:Hibernate_manual和Hibernate_auto. 2.单击选中新建的Web项目Hibernate_au ...

  4. 高手从零开始的全定制发行版-Linux from Scratch

    在制作Linux发行版中Linux from Scratch可谓是真正的大师级.Linux from Scratch是在线的社区创建的一本电子书,目的是帮助那些根深蒂固的想方设法提高计算机性能的人(t ...

  5. Android记一次后台保活设计心得2018

    首先我并不推荐也不喜欢手机应用通过各种手段后台保活,但是当产品经理确定一定以及肯定地提出了这个需求,活着应用有着必须常驻后台的理由,也就只有硬着头皮去与各个手机的后台管理机制做斗争了. 背景:因为开发 ...

  6. [NS2]TCL语言基本语法

    (来自:<NS2仿真实验-多媒体和无线网络通信>) 1. 变量(Variable)和变量替换(Variable Substitution) tcl变量是在第一次使用set的指令来指派变量的 ...

  7. asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS)

    这篇文章介绍如何允许跨域访问 浏览器安全不允许不同域名的网页之间发送请求.这种限制叫做同源策略(the same-origin policy). 同源策略可以防止一个恶意的站点读取另一个站点的敏感数据 ...

  8. iOS: 设置App的国际化和本地化

    原文链接:http://www.cocoachina.com/appstore/20160310/15632.html 前言 App的名字设置方式有很多种,如果在App打包上线时不做修改,最终App的 ...

  9. eclipse安装pydev

    eclipse是常用的用来写java代码的IDE,但是其实也可以用来写python代码,只需要配置好pydev即可. 第一步 打开eclipse,点击Help,install new sofeware ...

  10. 在Spring3中使用注解(@Scheduled)创建计划任务

    Spring3中加强了注解的使用,其中计划任务也得到了增强,现在创建一个计划任务只需要两步就完成了: 创建一个Java类,添加一个无参无返回值的方法,在方法上用@Scheduled注解修饰一下: 在S ...