缓存
web缓存是可以自动保存常见的文档副本的HTTP设备,当web请求抵达缓存时,如果本地有已经缓存的副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。
- 缓存减少了冗余的数据传输
- 缓存环节了网络瓶颈的问题
- 缓存降低了对原始服务器的要求
- 缓存降低了距离时延。
冗余的数据传输
很多客户端访问一个流行的原始服务器页面的时候,服务器会多次传送同一份文档。每次传送给一个客户端,一些相同的字节会在网络中一遍遍地传输。这些冗余的数据传输会耗尽昂贵的网络带宽,降低传输速度,加重 Web 服务器的负载。
带宽瓶颈
很多网络中为本地网络客户端提供的带宽比远程服务器提供的带宽要宽。客户端会以路径上最慢的网速访问服务器。如果客户端从一个快速局域网的缓存中得到了一份副本,那么缓存就可以提高性能,尤其是要传送较大的文件的时候。
瞬间拥塞
缓存在破坏瞬间拥塞的时候显得十分重要,突发事件回事很多人去访问一个web文件,会出现瞬间拥塞,由此会造成过多流量峰值会使得web服务器发生毁灭性的崩溃。
距离时延
客户端和服务器之间没有太多的路由器,光速自身也会造成显著的时延。
命中和未命中的
缓存可以在任意时刻,任意的频率对副本进行验证。 缓存对缓存的副本进行在验证的时候,会向原始服务器发送一个小的在验证请求,如果内容没有发生变化,服务器会以一个小的304not modified进行响应,只要缓存知道副本任然有效,就会将副本标识为暂时新鲜的。并将副本提供给客户端这被称作再验证命中或缓慢命中。
HTTP提供了几个对已缓存对象进行在验证的工具,if-modified-since
。将这个首部添加到get请求中,就可以告诉服务器,只有在缓存了对象的副本之后,又对其进行了修改的情况下,才可以发送对象。
服务器内容未修改,服务器内容已经修改,或者服务器上的对象被删除了。服务器收到GETIf-modified-since
请求时候会发生的情况。
- 再验证命中: 如果服务器对象未被修改,服务器会向客户端发送一个小的HTTP304NotModified响应
- 再验证未命中: 如果服务器对象与已缓存副本不同,服务器向客户端发送一条普通的,带有完整内容的HTTP200OK响应
- 对象被删除: 如果服务器对象已经被删除了,服务器就回送一个 404 Not Found 响应,缓存也会将其副本删除。
缓存命中率: 由于缓存提供服务请求所占的比例被称为缓存命中率
字节命中率: 缓存提供的字节在传输的所有字节中所占的比例
HTTP 没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器得到的。在这两种情况下,响应码都是200OK,说明响应有主体部分。有
些商业代理缓存会在Via首部附加一些额外信息,以描述缓存中发生的情况。客户端有一种方法可以判断响应是否来自缓存,就是使用 Date 首部。将响应中
Date 首部的值与当前时间进行比较,如果响应中的日期值比较早,客户端通常就可以认为这是一条缓存的响应。客户端也可以通过 Age 首部来检测缓存的响应,通过这个首部可以分辨出这条响应的使用期
缓存的拓扑结构
私有缓存: Web 浏览器中有内建的私有缓存——大多数浏览器都会将常用文档缓存在你个人电脑的磁盘和内存中,并且允许用户去配置缓存的大小和各种设置。还可以去看看浏览器的缓存中有些什么内容
公有代理缓存:公有缓存是特殊的共享代理服务器,被称为缓存代理服务器
相关首部字段
Cache-Control: max-age: 文档的最大使用期
Expires: 指定一个绝对的过期日期
If-Modified-Since: :如果从指定日期之后文档被修改过了,就执行请求的方法
If-None-Match: : 服务器可以为文档提供特殊的标签
强弱验证器: 只要内容发生了变化,强弱验证器就会发生变化。
Cache-Control: no-store 和 Cache-Control: no-cache
Cache-Control: no-store: 禁止缓存对响应进行复制,缓存通常会像非缓存代理服务器一样,向客户端转发一条no-store响应。
Cache-Control: no-cache: 响应实际上是可以存储再本地缓存区中的,必须和服务器进行新鲜度验证,才能提供给客户端使用
Cache-Control: max-age=3600 表示的是从服务器将文档传来之时起,可以认为文档处于新鲜状态的秒数。
Expires: 实际的过期日期,而不是秒数。
Cache-Control: must-revalidate 响应首部告诉缓存,可以再实现没有和原始服务器进行再缓存的情况下,不能提供这个对象的陈旧副本。缓存仍然可以随意提供新鲜的副本。如果在缓存进行must-revalidate新鲜度检查时,原始服务器不可用,缓存就必须返回一条504Gateway Timeout错误。