作者归档:admin

HTTP缓存算法

HTTP协议缓存的目标是去除许多情况下对于发送请求的需求和去除许多情况下发送完整请求的需求。以不发送请求或减少请求传输的数据量来优化整个HTTP架构,此目标的实现可以产生如下好处:

  • 减少网络传输的冗余信息量
  • 缓解网络瓶颈的问题
  • 降低对原始服务器的请求量
  • 减少了传送距离,降低了因为距离而产生的时延

缓存基本处理过程包括七个步骤。

  1. 接收 – 缓存从网络中读取抵达的请求报文
  2. 解析 – 缓存对报文进行解析,提取出URL和各种首部
  3. 查询 – 缓存查看是否有本地副本可用,如果没有,就获取一份副本,并保存在本地
  4. 新鲜度检测 – 缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新
  5. 创建响应 – 缓存会用新的首部和已缓存主体来构建一条响应报文
  6. 发送 – 缓存通过网络将响应发回给客户端
  7. 日志 – 缓存可选地创建一个日志文件条目来描述这个事务

这里的缓存可以是本地客户端缓存,也可以是代理缓存之类的公共缓存。

HTTP缓存模型

HTTP缓存可以在不依赖服务器记住有哪些缓存拥有文档副本,而实现文档的一致。这些机制称为文档过期(document expiration)和服务器再验证(server revalidation),也可以称它们为截止模型和证实模型。

截止模型是HTTP请求中带上标记文档的过期时间,HTTP协议中使用如下两个字段标记过期时间:

  • Expires字段 – 指定一个绝对的过期日期。
  • Cache-control:max-age – 定义文档的最大使用期,从第一次生成文档到文档不再新鲜,无法使用为止,最大的合法生存时间(单位为s)

仅仅使用截止模型还不够,即使文档过期了,也并不意味着当前文档和原始服务器的文档不一致了。此时就到证实模型大显身手的时候了。证实模型需要询问原始服务器文档是否发生了变化。其依赖于HTTP协议的如下字段:

  • If-Modified-Since字段 – 如果从指定日期之后文档被修改了,就执行请求的方法。可以与Last-modified服务器响应首部配合使用。它告诉服务器只有在客户端缓存了对象的副本后,又服务器对其进行了修改的情况下,才在回复中发送此对象。如果服务器对象没有修改,返回304 Not Modified。如果服务器修改了此对象,发送此对象,返回200 OK。如果服务器删除了些对象,返回404 Not Found。
  • If-None-Match字段 – 服务器可以为文档提供特殊的标签(ETag),如果此标签与服务器的标签不一样,就会执行请求的方法。

如果服务器应答中包括一个ETag,又包括一个Last-Mofidied值,则客户端在发送请求时使用两种证实机制,并且只有当两种证实机制都满足时才会返回304 Not Modified。

缓存在新鲜度检测时,只需要计算两个值:已缓存副本的使用期和已缓存副本的新鲜生存期。

HTTP缓存使用期算法

响应的使用期是服务器发布响应(或通过证实模型再验证)之后经过的总时间。使用期包括了因特网中传输的时间,在中间节点缓存的时间,以及在本地缓存中的停留时间。

       /*
       * age_value 当代理服务器用自己的头部去响应请求时,Age标明实体产生到现在多长时间了。
       * date_value HTTP 服务器应答中的Date字段 原始服务器
       * request_time 缓存的请求时间
       * response_time 缓存获取应答的时间
       * now 当前时间
       */
 
      apparent_age = max0, response_time - date_value); //缓存收到响应时响应的年龄 处理时钟偏差存在时,可能为负的情况
 
      corrected_received_age = max(apparent_age, age_value);  //  容忍Age首部的错误
 
      response_delay = response_time - request_time; // 处理网络时延,导致结果保守
 
      corrected_initial_age = corrected_received_age + response_delay;
 
      resident_time = now - response_time; // 本地的停留时间,即收到响应到现在的时间间隔
 
      current_age   = corrected_initial_age + resident_time;

因此,完整的使用期计算算法是通过查看Date首部和Age首部来判断响应已使用的时间,再记录其在本地缓存中的停留时间就是总的使用期。除此之外,HTTP协议对时钟偏差和网络时延进行了一补偿,特别是其对网络时延的补偿,可能会重复计算已使用的时间,从而使整个算法产生保守的结果。这种保守的效果时,如果出错了,算法只会使文档看起来比实际使用期要老,并引发再验证。

HTTP缓存新鲜度算法

通过已缓存文档的使用期,根据服务器和客户端限制来计算新鲜生存期,就可以确定已缓存的文档是否新鲜。已缓存文档的使用期在前面已经介绍过了,这小节我们来看看新鲜生存期的计算。

为了确定一条响应是保鲜的(fresh)还是陈旧的(stale),我们需要将其保鲜寿命(freshness lifetime)和年龄(age)进行比较。年龄的计算见13.2.3节,本节讲解怎样计算保鲜寿命,以及判定一个响应是否已经过期。在下面的讨论中,数值可以用任何适于算术操作的形式表示。

与此相关的首部字段包括(按优先级从高到低): Cache-Control字段中“max-age”控制指令的值、Expires、Last-Modified、默认最小的生存期。用PHP代码体现如下:

    /**
     * $heuristic 启发式过期值应不大于从那个时间开始到现在这段时间间隔的某个分数
     * $Max_Age_value_set  是否存在Max_Age值  Cache-Control字段中“max-age”控制指令的值
     * $Max_Age_value  Max_Age值
     * $Expires_value_set 是否存在Expires值
     * $Expires_value Expires值
     * $Date_value Date头部
     * $default_cache_min_lifetime 
     * $default_cache_max_lifetime
     */
    function server_freshness_limit() {
        global $Max_Age_value_set, $Max_Age_value;
        global $Expires_value_set, $Expires_value;
        global $Date_value, $default_cache_min_lifetime, $default_cache_max_lifetime;
 
        $factor = 0.1; //典型设置为10%
 
        $heuristic = 0; //  启发式 默认为0
 
        if ($Max_Age_value_set) {   // 优先级一为 Max_Age
            $freshness_lifetime = $Max_Age_value;
        }elseif($Expires_value_set) {  //   优先级二为Expires
            $freshness_lifetime = $Expires_value - $Date_value;
        }elseif($Last_Modified_value_set) { //  优先级三为Last_Modified
            $freshness_lifetime = (int)($factor * max(0, $Last_Modified_value - $Date_value));
            $heuristic = 1; //  启发式
        }else{  
            $freshness_lifetime = $default_cache_min_lifetime;
            $heuristic = 1; //  启发式
        }
 
        if ($heuristic) {
            $freshness_lifetime = $freshness_lifetime > $default_cache_max_lifetime ? $default_cache_max_lifetime : $freshness_lifetime;
            $freshness_lifetime = $freshness_lifetime < $default_cache_min_lifetime ? $default_cache_min_lifetime : $freshness_lifetime;
        }
 
        return $freshness_lifetime;
 
    }

计算响应是否过期非常简单: response_is_fresh = (server_freshness_limit() > current_age)

以此为《HTTP权威指南》第七章读书笔记。

《驱动力》读后总结 – 是什么驱动了你

一本讲述人的书,它会告诉你:是什么驱动了你。作为企业,其核心是经济绩效,而经济绩效依赖于人的绩效,这本书也讲述了怎样可以提高人的绩效,特别是当一些常规手段失效时。在读书过程中反思,现在是什么在驱动自己?自己的动机在哪?这本书有什么内容可以应用到工作中? 有所收获,却也觉得书中所言不能全部信之。

书中介绍人的行为的驱动力有三种:

  • 第一种驱动力是生物驱动力,如饿了要吃饭,渴了要喝水,这是1.0时代,生物冲动;
  • 第二种驱动力是外在动机,做出特定行为后外部会带来奖励或惩罚,这是2.0时代,寻求奖励,避免惩罚。
  • 第三种驱动力是内在动机,是我们想要主导我们的生活、延展我们的能力,让生活更有意义的深层欲望。人类的天性决定了他们会寻求对自己命运的掌控权,希望自己引导自己

书中作者提出的自我决定理论认为人类有三种内在需求:

  • 能力的需求(competence)
  • 自主性的需求(autonomy)
  • 归属的需求(relatedness)

看到这些需求,这些驱动力的描述,不得不想起老马的基本需求层次理论。该理论将需求分为五种,像阶梯一样从低到高,按层次逐级递升,分别为:生理上的需求,安全上的需求,情感和归属的需求,尊重的需求,自我实现的需求。作者提出的自我决定理论,三个内在需求也是对应老马的理论中的三个层面的,是此理论范围太大,还是?

现在的我们更多的时候是处于第一驱动力或第二驱动力之中,为了生活奔波,这仅仅是因为需要养家糊口。第一驱动力是根本点,其对应到 马斯洛需求层次理论 是最底层的生理上的需求,为了活着。而第二驱动力是从第一驱动力而来,一些内容依赖于第一驱动力。比如奖励和惩罚,其最终的落脚点往往是第一驱动力的一些要素。

作者提到的驱动力3.0,在胡萝卜大棒失效的时代如何提高绩效、焕发热情的三大要素:自主、专精和目的。

驱动力3.0的三大要素

  • 自主:我做什么,我决定。这个时代我们并不需要更好的管理,而需要自我管理
  • 专精:把想做的事情做得越来越好。专业是一种痛苦,在通往专精的路上,没有鲜花,没有七色彩虹,在你不想做的时候还得继续做,并且这是一条渐近线。
  • 目的:超越自身的渴望。它是驱动力3.0的内容,驱动力3.0不拒绝利润,但是它强调目的最大化。我们老板常说:我们是在实现自己的梦想,现在只是在实现梦想的过程中顺便赚点钱。忽然想到,现在越来越多的人去创业,他们为了什么?梦想 OR 成功后的经济自由 OR 吃肉自由 OR 自由吃肉?

当我们还在为最底层的需求努力时,更上面的需求都是空的,但是如何现在给你高于平均水平的薪酬的同时,再给你更多的自主权,让你一展所长。此时是否有一种士为知己者死的感觉,嗯,要的就是这个。

但是从批判的角度去看上面的这句话:这里的平均水平是什么水平?一展所长是展示什么?自主权能有多自主?是否我们需要把这个平均水平提高,让自己处于更高的水平,此时这样的水平才有些意思,那如何做呢?如作者所说,让你更加的专精。作者提了5点建议:

  • 刻意练习的目标是提高成绩。这里更多的是要有目标,即不要太泛,广度是需要的,但是作为程序员来说,深度会更重要些,我们需要找到你专精的目标。
  • 重复、重复、再重复。我很相信1万小时理论:任何人如果想要在某一领域变得十分出色,都需要经过至少1万个小时的练习,才能够达到一个比较高的水平。
  • 想方设法获得批评性意见。知道自己的问题在哪,知道自己改进的方向在哪,才能更好的进步。
  • 关注自己的弱项。我们喜欢做我们擅长的事情,因为我们可以游刃有余,但是对于一个优秀的人来说,关注自己的弱项,在弱项上努力,使之不会成为严重短板。
  • 为身心俱疲做好准备。努力向专精看齐,在这条辛苦的路上,总会有一天你会身心疲惫,也许你会想着放弃,也许你会坚持,向左走,向右走,不同的结果。

一个伟大的人,就是一句话,这也应用于一个公司,一个伟大的公司,就是一句话。你的那句话是什么?“为中华之崛起而读书”?“修身齐家治国平天下”?今天的我比昨天更优秀吗?反思,反省。

那段不堪回首的日子

佛说:“人生有八苦,生,老,病,死,爱别离,怨憎会,求不得,五取蕴。”

病来如山倒,若那山倒没有致人命,则涌来一段如抽丝般的慢慢的折磨。

2012年8月24日,在经历了一天一晚的头痛后,早晨起来,发现无法实现吐口水等常规动作,半边脸已在受控范围之外。去医院,挂 神经科,得结果为面瘫,又名周围性面神经炎。医生开三天药,吃完复诊,没有好转,建议去康复科做针灸治疗。于是开始了两个多月的”抽丝过程“。最开始是消炎,早晨八点做针灸治疗(因为近视度数较高,无法做高压氧治疗),晚上吊水消炎。一个星期后头痛症状消失,停止吊水,开始每天早上请假治疗,白天上班的日子。在这些日子里,
体会了注射器在脸上扎针推药水过程中那种凉凉药水注射到脸上肌肉的感觉
体会了约十根针扎在脸上被脉动的电击振动的感觉
体会了长长的针从耳朵后面扎进去后做肌肉注射后对耳朵压迫的那种极度的胀痛
体会了在针灸时暖暖的红外线照在脸上让人可以小眯一会儿的舒服。
体会了慢慢可以控制自己脸上表情的惊喜
体会了失而复得的喜悦
体会了……

当然,也名正言顺可以不做表情,装酷,虽然不甚好看。
在用了兄弟在老家找到中药偏方以及坚持在医院治疗后,终于在十一前,可以在浅笑时不会很明显了,回家结婚也没有人看出来脸上有毛病。万幸!

现在就算大笑也没有问题了,只是还有部分肌肉无力,还在吃药,持续战斗中……

据说此病会复发
据说此病会有后遗症
据说有10%的人是冶不好的
据说……

之前一直有一句话在脑海中回响:”修身、齐家、冶国、平天下“。身体健康也应该是身修的一个很重要的部分。工作重要、学习重要、生活质量重要,这些能重要的一个大前提是身体健康,能有一个强健的体魄去实现你的工作计划、学习计划,能让你能舒服的享受生活。

文字很短、过程很长,道不出此中的滋味。只愿这世上的人们,少一些病痛,多一些健康、多一些幸福。

阿门!