《HTTP权威指南》第七章学习总结--缓存

  **定个小目标,吃透这本书,每天最少一章 CSDN 见**

缓存是HTTP通信中非常重要的一个部分,他能够让你在有限的带宽中达到更大的使用。给我的感觉缓存更新是一个活跃在原始WEB服务器前的优秀士兵,下面来说一下吧,

  1. 冗余的数据传输
    当一个东西流行起来后,就会有很对客户端访问这个事物的。但是他们获取的信息都是一样的,这会照成web服务器重发发送N多分一样的数据,里面并没有区别,这样不但占用了服务器的带宽资源,还会占用服务器的性能资源。如果在客户端和服务器之间存在N个缓存的话,就可以将一些热度够高的数据放到缓存上面,这样客户端就不用之间访问原始服务器了。
  2. 带宽瓶颈
    往往服务器的带宽都比客户端的带宽低,当所有当多个客户端同时从服务器上获取资源时网络延时会受到很多的影响。这种情况也可以通过缓存来解决,将客户端的请求在经过缓存的时候就已经完成, 这样能有晓得分担服务器的压力。
    如果A客户端想要访问C服务器中的TEST数据,他会经过B缓存。那么如果B缓存上面有A需要访问的数据,他就只需要花费A到C的时间。
  3. 瞬间拥塞
    缓存在破坏瞬间拥塞是显得非常重要,当突发事件发生是可能会瞬间造成和每秒中50000次请求甚至更多。大多服务器是承受不了这个负载的,所有以前很多时候当瞬间拥塞爆发时服务器往往都会崩溃,或者反应速度特别慢。如果有足够数量的缓存,是可以解决这些问题的。
  4. 距离时延
    当你下载国外的镜像文件时,你可能会明显感觉到网络延迟,但是当你下载本地文件时就特别快,你应该知道是为什么吧。在你必须下载一个国外镜像时,如果有个国内的缓存这是一件非常幸福的事情。
  5. 命中和未命中的
    看了上面的你是不是感觉缓存很厉害,但是缓存不可能保存世界上所有的文档的副本。如果你访问某个文档是,能够从缓存中获取到,这被称为缓存命中,如果缓存中没有,客户端通过缓存,到达原始服务器获取数据,就叫做缓存未命中。
    由于缓存中的内容为原始服务器的副本,所有他不能保证他是最新的,所以当客户端访问到缓存命中时,缓存会检查资源的新鲜度。这叫做再验证命中,或者叫做缓慢命中
    在这里插入图片描述
    由缓存提供服务的请求所占的比例被称为缓存命中率,有时也叫文档命中率,命中率在0到1之间,但通常用百分数来描述。对现在中等规模的web缓存来说40%的命中率是很合理的。
    由于文档并不是同样大小的,所有文档命中率不能说明一切,有些大型的对象被访问的次数可能比较少,但是由于单位的问题,所有很多人更愿意使用字节命中作为度量值。字节命中率表示缓存提供的字节在传输中所有字节所占的比例。通过这种度量方式,可以得知节省流量的程度。这样的方式无疑是跟精准的。
    HTTP客户端没有为用户提供如何来区分是否命中缓存。客户端可以通过Date首部的访问时间来进行判断,但这样不够精确,还可以通过Age首部来检查缓存的响应。通过这个首部可以分别出这条响应的使用期
  6. 缓存的拓扑结构
    缓存可以分为私有缓存和公有缓存
    私有缓存不需要很大的动力或存储空间,这样可以将其做的很小,很便宜。大多数浏览器都会将常用的文档缓存在你的个人电脑的磁盘上和内存上,并允许用户去配置缓存的大小和各种设置。还可以去看看浏览器的缓存中有些什么内容。
    公有缓存是特殊的共享到了服务器,被称为缓存代理服务器或者代理缓存。代理缓存会从本地缓存中提供文档,或者代表用户与服务器进行联系,公有缓存会接受来自多个用户的访问,所以通过他可以更好的减少冗余流量。在这里插入图片描述
    是实际中,实现层次化的缓存是很有意义的,在这种结构中,在较小的缓存中未命中的请求会被交给较大的缓存,这样可以将缓存细致化。在这里插入图片描述
    网状缓存,内容路由以及对等缓存
    有些网络结构会构建复杂的网状缓存,而不是简单的缓存层次结构。在网状路由中缓存会做出动态的缓存通信觉得,决定于那个父缓存进行对话或者彻底绕开缓存。这种代理缓存决定选择何种路由进行访问,管理和传送,因此可将其称为内容路由器。缓存直接这些更为复杂的关系允许不同的组织互为对等的实体,将他们的缓存链接起来,以实现共赢。提供可选的对等支持的缓存被称为兄弟缓存,HTTP并不支持兄弟缓存。
  7. 缓存的处理步骤
    第一步:缓存检查到一条网络链接上活动,读取输入数据。高性能的缓存湖同时从多条输入链接上读取数据,在整条报文抵达之前对事物进行处理。
    第二步:缓存将请求报文解析为片段,将首部的各个部分放入易于操作的数据结构中,这样缓存软件就更容易处理首部字段并修改它们。
    第三步:缓存获取了URL,查找本地副本,本地副本可能存储在内存,本地磁盘甚至附近的另一台计算机中。如果本地没有会到原始服务器上去获取,或者返回一个错误
    第四步:缓存会对每一个本地的文档进行新鲜度检查,过新鲜度“过时”的资源会进行标注或者删除,同时还会检查现有的新鲜资源是否以及在元素服务器更新了,如果有更新就会同步本地的资源文档。HTTP有一组非常负责的新鲜度检测规则,缓存产品支持的大量配置选项,以及与非HTTP新鲜度标准进行互通的需要则是问题变得更加严重了。
    第五步:我们希望缓存的响应看起来应该和服务器的一样,缓存将已缓存的服务器响应首部作为响应首部的起点,然后缓存对这些基本首部进行修改和扩充,注意,缓存不应该调整Date首部。Date首部表示是原始服务器最初产生这个对象的日期
    第六步:一旦响应首部准备好了,缓存就将响应回送给客户端。
    第七步:缓存应该像服务器一样保存用户访问的一些数据在这里插入图片描述
  8. 保持副本的新鲜度
    通过特殊的HTTP Cache-Control首部和Expires首部,HTTP让原始服务器向每个文档附加一个“过期时间”。在缓存文档过期之前,缓存可以以任意频率使用这些副本,无需与服务器关联,当然除非客户端请求中包含阻止提供已缓存或未验证资源的首部。但一旦以缓存的文档过期,缓存就必须与服务器进行核对,询问文档是否被修改过,如果被修改过,就需要获取一份新鲜的副本。
    服务器用HTTP/1.0的Expores首部或HTTP/1.1的Cache-Control:max-age响应首部来指定过期日期,同时还会带有响应主体。
    仅仅是已缓存文档过期了并不意味着它和原始服务器上目前处于活跃状态的文档有时间的区别,着只意味着带了要进行核对的时间了。这种情况被称为“服务器再验证”
    HTTO的条件方法可以高效的实现再验证。HTTP允许缓存像原始服务器发送一个“条件GET”,请求服务器只有在文档与缓存中现有副本不同时,才回送对象主体。HTTP定义了5个顶尖请求首部,对缓存再验证来说最有用的两个首部是If-Modified-Since和If-None-Match。所有的条件首部都以前缀“If-”开头。在这里插入图片描述
    If-Modified-Since:Date 再验证求情通常称为IMS请求,只有自某个日期之后资源发送了变化的时候If-Modified-Since条件为真,通常GET请求就会成功执行,携带新首部的信文档会被返回给缓存,新首部除了其他信息之外,还包含一个新的过期时间,如果指定日期后,文档没被修改条件就为假,后向客户端返回一个304的响应报文,为了提高效性,不会返回文档主体。这些首部是放在响应中返回的,但只返回那些需要在源端更新的首部,比如Content-Type首部通常不会被修改,所以通常不需要发送,一般会发送一个新的过期时间。
    在这里插入图片描述
    If-None-Match实体标签再验证,有些情况下使用最后修改时间再验证是不够的,有些文档可能会被周期性的重写,但实际包含的数据常常是一样的,尽管内容没有变化,但修改并不重要,不需要让世界返回内的缓存都重装数据,有些服务器也无法准确的判断最后的修改日期。为了解决这些问题,HTTP允许用户对被称为实体标签的“版本标识符”进行比较。实体标签是附加到文档上的任意标签。他们可能包含了文档的序列号或版本名,或者是文档内容的校验和以及其他指纹信息。但文档被修改是,可以修改文档的实体标签,来说明这个新的文档。这样就可以通过实体标签进行比较。在这里插入图片描述
    如果服务器上的实体标签以及发生了变化,服务器会在一个200 OK响应中返回新的内容以及相应的新的Etag。
    强弱验证:缓存可以用实体标签来判断与服务器相比,已缓存的版本是不是最新版本。有时服务器希望在对文档进行一些非实质性或不重要的修改时,不要使所有的已缓存副本都失效,HTTP/1.1支持弱验证器,如果只对内容进行了少量修改,就允许服务器声明那是足够好的等价体。只要内容发生变化,强验证器就会变化,弱验证器允许对一些内容进行修改,但内容的主要含有发送变化时,通常还是会变化的。有些操作不能用弱验证器来实现,所有服务器会用前缀“W/”来标识弱验证器。
    注意:原始服务器一定不能为两个不同的实体重用一个特定的实体标签值,或者两个语义不同的实体重用一个特定的弱体标签值,
  9. 控制缓存的能力
    //我想休息了,,都12.30了·························
    服务器可以通过HTTP定义的几种发送来指定在文档过期之前可以将其缓存多长时间。
    no-Store首部和no-cache首部可以放在缓存提供未经证实的已缓存对象:
    Pragma: no-cache
    Cache-Control:no-store
    Cache-Control:no-cache
    no-store,禁止缓存对响应进行复制,缓存通常会像非缓存代理服务器一样,像客户转发一条no-store响应,然后删除对象。
    no-cache实际上是可以存储在本地缓存区中的,只是与原始服务器端进行新鲜度再验证之前,缓存不能将其提供给客户端使用。
    Cache-Control:Max-age首部表示的是从服务器将文档传来时起,可以认为此文档处于新鲜状态的秒数,还有一个s-maxage首部,其行为一样,但仅适合用与共享缓存。
    Cache-Control:Max-age=3600
    Cache-Control:s-maxage=3600
    还开以不让缓存缓存文档
    Cache-Control:Max-age=0
    Cache-Control:s-maxage=0
    Expires响应首部是不建议使用的,因为它使用的是具体时间,由于每台服务器的时间可能是不一样的。
    如果原始服务器希望缓存严格准售过期信息,可以在原始响应中附加一个 Cache-Control:must-revalidate响应首部告诉缓存,在事先没有跟原始服务器进行再验证的情况下,不能提供这个对象陈旧副本。缓存仍然可以随意提供新鲜的副本。如果在缓存进行must-revalidate新鲜度检查时,原始服务器不可用,缓存就必须返回一条504错误。
    在这里插入图片描述
  10. 详细算法
    问了分别缓存文档是否足够新鲜,缓存只需要计算两个值;一缓存副本的使用期,和一缓存副本的新鲜生存期。
    响应到缓存时,缓存可以通过查看Date首部或Age首部来判断响应已使用的时间。在这里插入图片描述
    由于今天有一些事,所有导致只有晚上才有时间看一下,由于太困了,明天还要上班,里面的一些细节没有具体的书写。不过还是写完了,都1点过了·····睡觉
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值