使用缓存的优点:
- · 减少冗余的数据传输,节省网络费用
当多客户端访问同一个页面,服务器多次传输同一份文档。
- · 缓解网络瓶颈。不需要更多的带宽就能更快加载页面
很多网络为本地网络客户端提供的带宽笔比远程服务器更宽,客户端会以路径上最慢的网速访问服务器,如果客户端从快速局域网的缓存中得到了一份副本,就可以更快响应页面。缓存提高了性能。
- · 降低对原始服务器的要求。服务器可以更快响应,避免过载
- · 降低距离时延。 较远的地方加载页面更慢
瞬间拥塞
缓存可以破坏瞬间拥塞。突发事件使得众人几乎同一时间访问同一个资源时,过多的流量峰值可能会致使网络和web服务器出现崩溃——瞬间拥塞。
距离时延
每台网络路由器都会增加因特网流量的时延,光速自身也会造成时延。距离越长,时延会越严重。
缓存命中与未命中
若来自客户端的请求资源在缓存中有副本,即缓存命中;
若来自客户端的请求资源在缓存中没有副本,需要转发给原始服务器获取资源,即缓存未命中;
防止原始服务器中的内容发生变化,缓存需要时常通过新鲜度检测来确定是否更新副本,即缓存再验证。
再验证命中与再验证未命中
缓存对缓存的副本进行验证,会向原始服务器发送一个小验证请求,若资源未发生改变,则服务器返回302 not modified 响应,缓存将副本认为是新鲜的,并提供给客户端,即再验证命中;
若资源发生改变,此时需要转发给服务器获取最新的资源,并在缓存建立新的副本,再提供给客户端,即再验证未命中。
命中与未命中其实就是缓存中是否存在新鲜有效的副本资源而言。
如果请求的资源在服务器中已经删除,服务器返回404响应,缓存也会对副本进行删除。
如何辨别响应来自缓存还是服务器?
无论来自缓存还是服务器,响应码都是200。
有些商业代理缓存会在首部添加Via首部,描述缓存情况;
客户端中可以使用Date首部,将响应中Date首部的值与当前时间进行比较,如果响应中的值比较早,即判断其来自缓存;
客户端也可以通过Age首部,通过分辨这条响应的使用期来检测缓存的响应。
私有缓存与公有缓存
私有缓存是专用缓存,包含单个用户最常用的页面等;浏览器中有内建的私有缓存——临时文件
公有缓存是公共的缓存,很多用户都可以访问的公共资源;公有缓存是特殊的共享代理服务器,又称为代理缓存。代理缓存从本地缓存中提供文档,或者代表用户与服务端联系。
重复访问的区别
缓存的层次结构
较小缓存未命中的请求会被导向更大的父缓存。基本思想:在靠近客户端的地方使用小型廉价缓存,在更高层次中逐步采用更大、功能更强的缓存来装载多用户共享资源。
缓存层次深的情况下,每个代理都会带来一些性能损耗,实际应用中会将深度限制在2~3个代理内,新一代的高性能代理服务器使得代理链的长度不那么重要。
缓存的处理步骤
1. 接收请求报文
2. 解析报文,提取URL&首部
3. 查询本地是否有副本
4. 新鲜度检测
5. 创建响应
6. 发送响应
7. 记录日志
如何保持副本的新鲜度?
文档过期时间
HTTP的Cache-Control首部和Expires首部(老式)标识过期时间,在文档过期之前,缓存都不需要向父缓存代理或原始服务器发送请求(除非客户端请求中包含组织提供已缓存或未验证资源的首部),当缓存过期,就必要要与服务器进行新鲜度测试。
Cache- Control: max- age= 484200 ——max-Age标识了最大使用期,单位s
Expires: Fri, 05 Jul 2002, 05: 00: 00 GMT ——GMT 格林尼治标准时间
缓存再验证使用条件首部
HTTP允许缓存向原始服务器发送GET请求,对于缓存再验证使用If-Modified-Since:Date 和If-None-Match:tags 首部。
If-Modified-Since:Sat, 29 Jun 2002, 14:30:00 GMT
如果在Sat, 29 Jun 2002, 14:30:00 GMT之后资源发生了变化,GET请求会被执行,携带包含新过期时间的首部的文档会被返回到缓存;若资源未发生变化,原始服务器会发送304响应
If-None-Match: "v2.4","v.2.3"
该首部用来解决If-Modified-Since首部可能存在的不足,例如:有些文档做了不重要的修改或是有些服务器无法准确判定页面的最后修改日期等。通过验证服务器中的tags是否相符来确定资源是否已经修改,可以包含多个tags,表示当前缓存中已经存在带有这些tags的对象副本。
缓存控制首部
Cache-Control:no-store,no-cache,must-revalidate,max-age
no-store: 禁止缓存对响应进行复制,缓存向客户端转发no-store响应,并删除对象
no-cache: 可以在本地缓存区中存储,在与原始服务器进行新鲜度验证前,不能将其提供给客户端使用
max-age: 从服务器将文档传来的时候起,文档保持新鲜度的秒数
Expires:指定实际过期日期 而非秒数,不推荐使用。很多服务器的时钟不同步或者不正确
must-revalidate: 原始服务器希望缓存严格遵守过期信息,就要附加must-revalidate响应头部,在事先没有跟原始服务器进行再验证的情况下,不提供该对象的陈旧副本(不在新鲜度内的副本)。
客户端新鲜度限制
通过Refresh或Reload刷新缓存