缓存:
当web请求抵达缓存时,如果本地有“已缓存”副本,就可以从本地存储设备而不是原始服务器提取这个文档。使用缓存有一下优点:
减少了冗余的数据传输,节省可你的网络费用
缓解了网络瓶颈的问题。
降低了对原始服务器的要求。
降低了距离时延。
命中和未命中的
缓存无法保存世界上每份文档的副本。
可以用已有的副本为某些到达缓存的请求提供服务------缓存命中
一些到达缓存的请求可能会由于没有副本可用,而被转发给原始服务器------缓存未命中
再验证
原始服务器的内容可能会发生变化,缓存要时不时对其进行检测,看看他们保存的副本是否任是服务器上最新的副本。这些“新鲜度检测”被称为HTTP再验证。
缓存可以再任意时刻,以任意的频率对副本进行再验证。但由于缓存中通常会包含数百万的文档,而且网络带宽是很珍贵的,所以大部分缓存只有再客户端发起请求,并且副本旧得足以需要检测时候,才会对副本进行再验证。
缓存对副本进行再验证得时候,会向原始服务器发送一个小的再验证请求,如果内容没有变化,服务器会以一个小的304 Not Modified 进行响应。只要缓存知道副本任然有效,就会再次将副本标识为暂时新鲜的,并且将副本提供给客户端------再验证命中或者缓存命中
这种方式要与原始服务器进行核对,所以会比单纯的缓存命中慢,但它没有从服务器中获取对象数据,所以要比缓存未命中快一些,失败的再验证几乎和未命中的速度一样。
HTTP为我们提供了几个用来对已缓存对象进行再验证的工具,但最常用的是If-Modified-Since首部。将这个首部添加到get请求中去,就可以告诉服务器,只有再缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象。
再验证命中 服务端向客户端发送304响应
再验证未命中 服务端向客户端发送一条普通的,带有完整内容的200响应
对象被删除 服务器回送一个404 响应,缓存也会将其副本删
缓存再验证区分命中和未命中的情况
HTTP没有未用户提供一种手段来区分响应是缓存命中的还是访问原始服务器得到的。在这两种情况下,响应码都是200,说明响应有主题部分。有写商业代理缓存会在via首附加一些额外信息,以描述缓存中发生的情况。
客户端有一种方法可以判断响应是否来自缓存,就是使用Date首部。将响应中Date首部与当前时间比较,如果响应中的日期值比较早,客户端通常就可以认为这是一条缓存的响应。客户端也可以通过Age首部来检测缓存的响应,通过这个首部可以分辨出这个响应的使用期。
缓存的拓扑结构
私有缓存:单个用户专用 , web浏览器中有内建的私有缓存----大多数浏览器都会将常用的文档缓存在你个人电脑的磁盘和内存中,并且允许用户去配置缓存的大小和各种设置。
共享缓存:用户团体,是特殊的共享代理服务器,被称为缓存代理服务器或者代理缓存。代理缓存会从本地文档中提供文档,或者代表用户与服务器进行联系。公有缓存会接受来自多个用户的访问。所以通过它可以更好地减少冗余流量。
每个私有缓存要获取同一份文档,这样它就会多次穿过网络。
使用共享的公有缓存时,对于这个流行的对象,缓存只要取一次就行了。
可以通过手工代理,或者通过代理自动配置文件,将你的浏览器配置为使用代理缓存。还可以使用通过拦截代理在不配置浏览器的情况下,强制HTTP请求经过缓存传输。
代理缓存的层次结构
在实际中,实现层次化的缓存时很有意义的,在这种结构中,在较小缓存中未命中的请求会被导向较大的父缓存,由它来为剩下的那些“提炼过的”流量提供服务。
上图中基本思想是在靠近客户端的地方使用小型廉价缓存,而更高层次中,则逐步采用更大,功能更强的缓存来装载多用户共享的文档。
在缓存层次结构很深的情况下,请求可能要穿过很长一段缓存,但每个拦截代理都会添加一些性能损耗,当代理链路变得很长的时候,这种性能损耗会变得非常明显。
网状缓存、内容路由以及对等缓存
网状缓存中的代理缓存之间会以更加复杂的方式进行对话,做出动态的缓存通信决策,决定与哪个父缓存进行对话,或者决定彻底绕开缓存,直接连接原始服务器。这种代理缓存会决定选择何种路由对内容进行访问、管理和传送。因此可以将其称为内容路由器。
网状缓存中为路由设计的缓存(除了其他任务之外)要完成一下功能:
根据url在父缓存或原始服务器之间进行动态的选择。
根据url动态地选择一个特定的父缓存。
前往父缓存之前,在本地缓存中搜索已缓存的副本。
允许其他缓存对其缓存的内容进行访问,但不允许因特网流量通过它们的缓存。
缓存之间这些更为复杂的关系允许不同的组织互为对等实体,将它们的缓存连接其他实现共赢。提供可选的对等支持的缓存被称为兄弟缓存。HTTP并不支持兄弟缓存。所以人们通过一些协议对HTTP进行扩展,比如因特网缓存协议(ICP)和超文本缓存协议(HTCP)。
领取专属 10元无门槛券
私享最新 技术干货