Open cqupt-yifanwu opened 7 years ago
从浏览器地址栏输入url到显示页面的步骤
输入URL
查看缓存
i. 如果资源未缓存,发送新请求
ii. 如果已缓存,检验是否新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证
iii. 检验新鲜有两个HTTP头进行控制Expires和Cache-Control:
HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期
HTTP1.1增加了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间
浏览器解析URL获取协议、主机、端口和path
浏览器组装
代理缓存的层次结构 层次化缓存的意义十分重大,在这种结构中,在较小的缓存未命中的请求会导向较大的父缓存,由它来为剩下的那些“提炼过的”流量提供服务。 Q : 从子缓存未命中到父缓存中去查找也未命中的这个过程,会不会比没有缓存直接去服务器请求更加消耗性能呢?
关于缓存
什么是缓存 缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。http中具有缓存功能的是浏览器缓存,以及缓存代理服务器。http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档
为什么要使用缓存
私有缓存 专用的缓存被称为私有缓存,它不需要很大的动力或者存储空空间,这样就可以做的很小,比较便宜。我们的web浏览器中就有私有内存,它们大多都存在我们电脑的个人磁盘和内存中,并且允许设置大小等。在浏览器的地址输入框和直接F5刷新采用的是不同的机制,前者会查看是否有有效的缓存,有效的缓存会组织请求流向原始服务器,后者会直接询问原始服务器,验证更变
公有缓存 公有缓存是特殊的共享代理服务器,它会接收来自多个用户的访问,代理缓存会从本地的缓存中提供文档,对于流行的对象缓存只需要取一次就可以了,它会用共享的副本为所有的请求服务,以降低网络的流量。
缓存的处理步骤
接收 缓存从网络中读取抵达的请求报文
解析 缓存对报文进行解析,提取URL和各种首部。
查找 缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存到本地)。
缓存无法保存世界上的每份文档,当可以用已有的副本为某些到达缓存的请求提供服务时成为缓存命中,从而衍生出缓存命中率和字节命中率等概念。其他一些到达缓存的请求可能会由于没有副本可用被转发给原始的服务器,这称为未命中。 再验证:原始服务器的内容很可能发生变化(下面的新鲜度检测会详细讲解)缓存要不时的对其进行检测,这个过程并不需要从服务器获取整个对象,就可以快速检测。在项目的开发中也有可能因为缓存的问题使我们原本的改动无法呈现。
新鲜度检测 缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。(首部自身都可以强制缓存的验证)
创建响应 缓存会用新的首部和已缓存的主题来构建一条响应报文。
发送 缓存通过网络将响应发回客户端
日志 缓存可选地创建一个日志文件条目来描述这个事务。
设置缓存控制
不同的web服务器为HTTP Cache-control 和 Expiration 首部的设置提供了一些不同的机制
<Files *.html> Header set Cache-control on-cache </Files>
` 但是支持这个可能给服务器增加额外的负担,所以通过配置正确的服务器发出HTTP首部是传送文档缓存控制的唯一可靠的方法.