Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP-缓存 #1

Open
cqupt-yifanwu opened this issue Jan 24, 2017 · 2 comments
Open

HTTP-缓存 #1

cqupt-yifanwu opened this issue Jan 24, 2017 · 2 comments

Comments

@cqupt-yifanwu
Copy link
Owner

关于缓存

  • 什么是缓存
    缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。http中具有缓存功能的是浏览器缓存,以及缓存代理服务器。http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档

  • 为什么要使用缓存

  1. 缓存减少了冗余的数据传输,不仅减少了用于流量的费用,还节约了用户的时间。
  2. 减轻了服务器的负担,有效的缓存可以可以不需要服务器再重新发送,大大提高了网站的性能。
  3. 缓解了网络带宽的问题,不需要更多的带宽就可以更快的加载页面。
  4. 降低了距离时延,因为在信息的传播中,距离越长时延越大,缓存可能存在本地或者较近的(代理)服务器上,不需要更远的距离去请求。
  • 缓存的种类
  1. 私有缓存
    专用的缓存被称为私有缓存,它不需要很大的动力或者存储空空间,这样就可以做的很小,比较便宜。我们的web浏览器中就有私有内存,它们大多都存在我们电脑的个人磁盘和内存中,并且允许设置大小等。在浏览器的地址输入框和直接F5刷新采用的是不同的机制,前者会查看是否有有效的缓存,有效的缓存会组织请求流向原始服务器,后者会直接询问原始服务器,验证更变

  2. 公有缓存
    公有缓存是特殊的共享代理服务器,它会接收来自多个用户的访问,代理缓存会从本地的缓存中提供文档,对于流行的对象缓存只需要取一次就可以了,它会用共享的副本为所有的请求服务,以降低网络的流量。

缓存的处理步骤

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

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

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

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

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

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

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

设置缓存控制

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

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

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

输入URL

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

浏览器解析URL获取协议、主机、端口和path
浏览器组装

@cqupt-yifanwu
Copy link
Owner Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant