带缓存的HTTP代理服务器(五)

来源:互联网 发布:凌阳单片机语音识别 编辑:程序博客网 时间:2024/05/01 00:03

代理服务器缓存

项目地址:https://code.csdn.net/sakeven/httpproxy

关于WEB 缓存基础知识,请先阅读这篇文章:

https://www.mnot.net/cache_docs/ (或者中文版

         http://www.cnblogs.com/xyjsw/archive/2010/01/27/1657825.html)

缓存代理

缓存代理通常规模较大,因为它要为成千上百的用户提供服务,也正因为此,它必须是一个共享缓存,它的每一个缓存副本必须可以为多用户使用。

基于此的一个重要作用是:可以明显地减少响应时间和降低网络流量。

缓存处理步骤

对一条HTTP GET报文的基本缓存处理过程包括7个步骤:

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

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

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

4.      新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。

5.      创建响应——缓存会用新的首部和已缓存的主体来构建一条响应报文,

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

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

这里我们需要重点关注的是新鲜度检测。

新鲜度检测

缓存是有有效期,在有效期内,缓存副本可以被任意多次使用,一旦过了有效期,就应该重校验这个缓存副本。

与缓存控制有关的响应首部:Cache-Control、Expires、Date。

Cache-Control

                  public:表示可以被任何缓存器缓存

                  private:禁止响应被共有缓存器缓存

                  no-cache:强制每次请求必须向服务器验证

                no-store:强制禁止响应被缓存

  max-age=(秒)、s-maxage=(秒):报文创建后的相对过期时间,后者用于代理服务器缓存

Expires:指定绝对过期时间,如果Cache-Control中存在max-age或s-maxage,优先使用Cache-Control中的,而不是Expires。

Date:报文创建的日期和时间

利用上面几个响应首部,我们可以计算出缓存副本的有效期,当我们在有期内发起请求,我们可以直接提供缓存副本作为响应。

缓存重校验

与重校验有关的首部:

Last-Modified:文档最后修改时间

If-Modified-Since:用于发起条件请求,与Last-Modified配合使用。如果自上次请求之后,文档未被修改过,则服务器返回一条304 Not Modified响应;否则送回新的文档。

Etag:实体标签

If-None-Match:用于发起条件请求,实体标签在验证,与 Etag 配合使用,与If-Modified-Since类似。

       以上两个用于重校验的条件请求因尽可能同时使用。

关于缓存这块的代码,还在进行中。

 

0 0
原创粉丝点击