zoukankan      html  css  js  c++  java
  • HTTP缓存

    web缓存是可以自动保存常见文档的HTTP设备。当web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档。

    缓存的优点

    • 减少了冗余的数据传输,节省了网络费用;
    • 缓解了网络瓶颈的问题。不需要更多的带宽就能够更快地加载页面;
    • 缓存降低了对原始服务器的要求。服务器可以更快地响应,避免出现过载的情况;
    • 缓存降低了距离时延,因为从较远的地方加载页面会更慢一些;

    命中和未命中

    缓存无法保存所有的文档的副本,当到达缓存的请求所需的文档在本地有副本可用时,这被称为缓存命中(cache hit)。其它一些到达缓存的请求可能会由于没有副本可用,而被转发给原始服务器,这被称为缓存未命中(cache miss)

    HTTP再验证(revalidation)

    原始服务器的内容可能会发生变化,缓存要不时对其进行检测,看看它们保存的副本是否仍是服务器上最新的副本。这些“新鲜度检测”被称为HTTP再验证(revalidation)

    为了有效地进行再验证,HTTP定义了一些特殊的请求,不用从服务器上获取整个对象,就可以快速检测出内容是不是最新的。

    缓存可以在任意时刻,以任意频率对副本进行再验证。大部分缓存只有在客户端发起请求,并且副本旧得足以需要检测时,才会对副本进行再验证。

    缓存对副本进行再验证时,会向原始服务器发送一个小的再验证请求。如果内容没有变化,服务器会以一个小的304 Not Modified进行响应。只要缓存知道副本仍然有效,就会再次将副本标识为暂时新鲜的,并将副本提供给客户端,这被称作再验证命中(revalidate hit)缓慢命中(slow hit)。这种方式要与原始服务器进行核对,所以会比单纯的缓存命中要慢,但它没有从服务器获取对象数据,所以要比缓存未命中快一些。

    HTTP为我们提供了几个用来对已缓存对象进行再验证的工具,但最常用的是If-Modified-Since首部。将这个首部添加到GET请求中,就可以告诉服务器,只有在缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象。

    以下列出了服务器收到GET If-Modified-Since请求时会发生的3种情况:

    • 再验证命中

      如果服务器对象未被修改,服务器会向客户端发送一个HTTP304 Not Modified响应。

    • 再验证未命中

      如果服务器对象与已缓存的副本不同,服务器向客户端发送一条普通的、带有完整内容的HTTP200 OK响应。

    • 对象被删除

      如果服务器对象已经被删除了,服务器就回送一个HTTP404 Not Found响应,缓存也会将其副本删除。

    命中率

    由缓存提供服务的请求所占的比例被称为*“缓存命中率(cache hit rate,或称为缓存命中比例),有时也称为文档命中率(document hit rate)**。命中率在0到1之间,但通常是用百分数来描述的。0%表示每次请求都未命中,100%表示每次请求都命中(在缓存中有一份副本)。

    缓存命中率理想值是100%,而实际得到的命中率则与缓存的大小、缓存用户兴趣点的相似性、缓存数据的变化或个性化频率,以及如何配置缓存有关。命中率很难预测,但对现在中等规模的Web缓存来说,40%的命中率是很合理的。

    缓存的好处是,即使是中等规模的缓存,其所包含的常见文档也足以显著地提高性能、减少流量了。缓存会努力确保将有用的内容保存在缓存中。

    字节命中率

    由于文档并不全是同一尺寸的,所以文档命中率并不能说明一切。有些大型对象被访问的次数可能较少,但由于尺寸的原因,对整个数据流量的贡献却更大。因此,有些人更愿意使用字节命中率(byte hit rate作为度量值(尤其那些按流量付费的人)。

    字节命中率表示的是缓存提供的字节在传输的所有字节中所占的比例。通过这种度量方式,可以得知节省流量的程度。100%的字节命中率说明每个字节都来自缓存,没有流量流到因特网上去。

    文档命中率和字节命中率对缓存性能的评估都是很有用的。文档命中率说明阻止了多少通往外部网络的Web事务。事务有一个通常都很大的固定时间成分(比如,建立一条到服务器的TCP连接),提高文档命中率对降低整体延迟(时延)很有好处。字节命中率说明阻止了多少字节传向因特网。提高字节命中率对节省带宽很有利。

    区分命中和未命中的情况

    不幸的是,HTTP没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器得到的。在这两种情况下,响应码都是200 OK。有些商业代理缓存会在Via首部附加一些额外信息,以描述缓存中发生的情况。

    客户端有一种方法可以判断响应是否来自缓存,就是使用Date首部。将响应中Date首部的值与当前时间进行比较,如果响应中的日期值比较早,客户端通常就可以认为这是一条缓存的响应。客户端也可以通过Age首部来检测缓存的响应,通过这个首部可以分辨出这个响应的使用期。

    缓存的拓扑结构

    缓存可以是单个用户专用的,也可以是数千名用户共享的。专用缓存被称为私有缓存(private cache)。私有缓存是个人的的缓存,包含了单个用户最常用的页面。共享的缓存被称为公有缓存(public cache)。公有缓存中包含了某个用户团体的常用页面。

    私有缓存

    私有缓存不需要很大的动力或存储空间,这样就可以将其做得很小,很便宜。Web浏览器中就有內建的私有缓存——大多数浏览器都会将常用文档缓存在你个人电脑的磁盘和内存中,并且允许用户去配置缓存的大小和各种设置。

    公有代理缓存

    公有缓存是特殊的共享代理服务器,被称为缓存代理服务器(caching proxy server),或者更常见地被称为代理缓存(proxy cache)。代理缓存会从本地缓存中提供文档,或者代表用户与服务器进行联系。公有缓存会接受来自多个用户的访问,所以通过它可以更好地减少冗余流量。

  • 相关阅读:
    状态机的常见问题
    基于quartus的高级时序分析
    FPGA中的时钟域问题
    quartus中的时序约束常用方法
    时序约束与时序分析
    FPGA的PCB设计
    AXI4的主机协议代码分析
    selenium 笔记 场景判断
    Codeforces Round #676 (Div. 2) XORwice、Putting Bricks in the Wall、Palindromifier
    Trap HDU
  • 原文地址:https://www.cnblogs.com/praglody/p/8136418.html
Copyright © 2011-2022 走看看