cqupt-yifanwu / cqupt-yifanwu.github.io

jiaoguibin.top
http://jiaoguibin.top
2 stars 0 forks source link

HTTP-缓存 #1

Open cqupt-yifanwu opened 7 years ago

cqupt-yifanwu commented 7 years ago

关于缓存

缓存的处理步骤

  1. 接收 缓存从网络中读取抵达的请求报文

  2. 解析 缓存对报文进行解析,提取URL和各种首部。

  3. 查找 缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存到本地)。

    缓存无法保存世界上的每份文档,当可以用已有的副本为某些到达缓存的请求提供服务时成为缓存命中,从而衍生出缓存命中率和字节命中率等概念。其他一些到达缓存的请求可能会由于没有副本可用被转发给原始的服务器,这称为未命中。 再验证:原始服务器的内容很可能发生变化(下面的新鲜度检测会详细讲解)缓存要不时的对其进行检测,这个过程并不需要从服务器获取整个对象,就可以快速检测。在项目的开发中也有可能因为缓存的问题使我们原本的改动无法呈现。

  4. 新鲜度检测 缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。(首部自身都可以强制缓存的验证)

    • 文档过期,通过特殊的HTTP Cache-Control首部和Expires首部,来标记文档的“保质期”。
    • 服务器再验证 仅仅是已缓存文件过期了并不意味着它和原始服务器上目前处于活跃状态的文档有实际的区别,只是说到了要审核的时间了,说明缓存需要访问原始服务器是否发生了变化。如果发生了变化,缓存会获取一份新的文档副本,并且将其存到旧的文档的位置上;如果没有发生变化,缓存只需要获取新的首部,包括一个新的过期日期,并对缓存中的首部进行更新。
    • 用条件方法进行验证
      1. If-Modified-Since:Data

        指定日期或者时间,如果从指定日期之后文档修改过了就执行请求方法。可以与Last-Modofied服务器响应首部配合使用,只有内容在被修改过以后与已缓存版本有所不同时才会获取内容(注意:这里不一定是以后而是有不同就获取)。如果“过期”通常GET就会执行成功,携带新首部的文档会被返回给缓存;如果“未过期”则只返回一个新的过期日期。

      2. If-None-Match:实体标签再验证 与上面不同,这个方法是通过一个额外的标签来识别版本(附加到文档上的任意标签或者引用字符串),因为在某些情况下仅仅使用上面的方法是不够的,例如:有些文档会周期性的修改但是包含的数据是一样的,有些数据可能被修改了但是这个修改并不是很重要;有些服务器无法获取到修改时间等。
      3. 弱验证器
  5. 创建响应 缓存会用新的首部和已缓存的主题来构建一条响应报文。

  6. 发送 缓存通过网络将响应发回客户端

  7. 日志 缓存可选地创建一个日志文件条目来描述这个事务。

设置缓存控制

不同的web服务器为HTTP Cache-control 和 Expiration 首部的设置提供了一些不同的机制

  1. 控制Apache的HTTP首部 Apache Web 服务器提供了几种设置HTTP缓存控制首部的机制,其中很多机制需要人为启动。
    1. mod_headers 通过这个模块可以单独对首部进行设置(设置单个HTTP首部指令来扩充Apache的配置文件),下面是将文件都标识为非缓存的实例: <Files *.html> Header set Cache-control on-cache </Files>
    2. mod_expries 它提供的程序逻辑可以自动生成带有正确过期日期的Expires首部,通过模块为文件设置过期日期和缓存能力。
    3. mod_cern_meta
  2. 通过HTTP-EQUIV控制HTML缓存 HTTP服务器响应首部用于会送文档的到期信息以及缓存控制信息,web服务器与配置文件进行交互,为所提供的文档分配正确的Cache-Control首部。 为了让作者无需与web服务器的配置文件进行交互的情况下HTML2.0定义了标签 `

    ` 但是支持这个可能给服务器增加额外的负担,所以通过配置正确的服务器发出HTTP首部是传送文档缓存控制的唯一可靠的方法.

cqupt-yifanwu commented 7 years ago

从浏览器地址栏输入url到显示页面的步骤

输入URL

查看缓存
i. 如果资源未缓存,发送新请求
ii. 如果已缓存,检验是否新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证
iii. 检验新鲜有两个HTTP头进行控制Expires和Cache-Control:
    HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期
    HTTP1.1增加了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间

浏览器解析URL获取协议、主机、端口和path
浏览器组装
cqupt-yifanwu commented 7 years ago

代理缓存的层次结构 层次化缓存的意义十分重大,在这种结构中,在较小的缓存未命中的请求会导向较大的父缓存,由它来为剩下的那些“提炼过的”流量提供服务。 Q : 从子缓存未命中到父缓存中去查找也未命中的这个过程,会不会比没有缓存直接去服务器请求更加消耗性能呢?