- 
                Notifications
    You must be signed in to change notification settings 
- Fork 11
Description
HTTP缓存知识
缓存
缓存(Cache)是指存储特定资源的一份拷贝,在下次使用该资源时提供该拷贝的技术.
缓存在计算机中十分常见,最早源于1967年的一篇电子工程期刊论文.缓存最早出现的目的是为了协调CPU的运行速度与内存读取数据的速度之间的矛盾.
如今的缓存已的概念已经得到扩充,不仅仅是CPU与主内存之间有Cache,而且内存与硬盘之间也有Cache(磁盘缓存),甚至硬盘与网络之间也有缓存.
凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输的速度差异的接口,均可称之为Cache.--Wikipedia-缓存
今天我们要讲的是介于浏览器与服务器之间的缓存(HTTP缓存),合理运用Web缓存可以减少对服务器的压力,也提高了网页的加载速度,能够有效提高网站与应用性能.
Web缓存
当浏览器发现请求的资源已经被存储,就会拦截该请求,返回对该资源的拷贝,省去了去源服务器重新下载的麻烦.这样做对服务器与浏览器都有好处:
- 缓解服务器压力,提升性能
- 提高网站请求的速度
但是缓存的时效性要考虑,毕竟不是每个资源都是永久不变的.
Web缓存的种类
本文主要讲的是浏览器缓存,除此之外还有
- 代理缓存
- 网关缓存
- CDN缓存
- 反向代理缓存
- 负载均衡器
大体上可以归纳为两个大类
- 私有缓存
- 共享缓存
私有缓存只能运用于单个用户,共享缓存被多个用户使用,如下图所示
缓存的操作目标
HTTP缓存不是必须的,但是重用资源通常是必要的,常见的HTTP缓存只能存储GET响应,其他的类型缓存无能为力.
TODO: 针对一些特定的请求,也可以通过关键字区分多个存储的不同响应以组成缓存的内容。具体参考下文关于 Vary 的信息.
缓存控制
正如之前所说的,缓存需要进行合理配置,考虑缓存的时效性.下面有几种方法来对缓存进行控制
- Cache-Control:HTTP/1.1定义,可以用来区分缓存机制的支持情况,请求头与响应头都支持这个属性
- Pragma头:HTTP/1.0定义,请求头中包含Pragma头效果同Cache-Control:no-cache,但是响应头不支持这个属性,因此不能完全取代Cache-Control头,通常用于向后兼容基于HTTP/1.0的客户端
验证缓存有效性的过程
原因:HTTP协议是无状态的,服务器的资源变化是无法通知到客户端的
- 发送请求给服务器,服务器返回浏览器所需要的资源,并且在响应头中附带上的Cache-Control信息
- 浏览器收到响应头的Cache-Control信息,知道资源有效期有100秒
- 在资源有效期100秒内用户再次请求该资源,浏览器会将其拦截住,直接从浏览器缓存中读取需要的资源
- 在资源有效期100秒以外的时间,用户再次请求该资源,浏览器知道已经过了最初服务器告知的有效期时长,因此不能再像步骤3一样直接从缓存中取出资源.浏览器将发送HTTP请求,顺带If-None-Match来询问服务器是否有更新.如果缓存依旧有效,服务端会响应一个304状态码与一个空的body;如果缓存无效,则重复步骤1
Cache-Control:max-age=N指明缓存有效时间为N,如果这个请求头没存在,浏览器则会去查看是否包含Expires头,通过比较Expires头来确定缓存是否有效如果两者都没有,则通过查找
Last-Modified信息缓存的寿命就等于头里面Date的值减去
Last-Modified的值除以10
revving技术
不频繁更新的文件会使用特定的命名方式:在URL后面(通常是文件名后面)会加上版本号。加上版本号后的资源就被视作一个完全新的独立的资源.
好处:同时更新两个缓存资源不会造成部分缓存先更新而引起新旧文件内容不一致。


