[toc]
缓存的作用
- 减少带宽
- 降低原始服务器压力
- 降低距离,网络造成的延时问题
1. 类别
1.1 私有缓存
1.1.1 浏览器缓存
浏览器会在我们的硬盘上开辟一块控件来存储资源副本,一个请求从浏览器缓存里调出几乎是立即显现出来的,比如一张图片。 首页一般不会被缓存
Cache-Control
- no-cache 强制在缓存前发送带验证器的请求到服务器
备注:
- 具体实现和浏览器有关,在chrome中测试永远返回
200 OK,因为请求头中不会带有校验信息(不管请求头和响应头谁设置了)。但是Safari中,会先去验证。- 从字面上看很容易把
no-cache理解成‘不缓存’,但事实上代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,no-store才是真正的不缓存资源
- no-store 不缓存
- max-age( s ) 设置浏览器缓存的最大周期, 单位为秒
备注:
- 在缓存周期(新鲜期)内, 请求不会去访问服务端资源, 直接去缓存取副本资源,并返回状态
200 from cache;- 如果资源更新了, 缓存新内容, 返回
200;- 过了新鲜期后,请求会带着验证器访问服务器, 如果资源没有变化, 则继续取的是缓存数据, 并返回
304 Not Modified, 并更新新鲜度;- 如果服务端已没有此资源, 删除缓存, 返回
404;- 如果参数为0,那么缓存服务器通常会将请求转向源服务器;
- s-maxage( s ) 设置所为用户共享缓存的缓存存储的最大周期,对于像同一个用户返回响应的服务器来说这个指令没有任何作用。
- Expires HTTP1.1 已经抛弃,建议用 max-age
验证器
- if-match 通常是数据内容的 mdn 值,由原始服务器生成。如果值与
ETage值相同,才返回资源。(if-None-match与之相反)
服务端相应的为
ETag
- if-Modified-Since:是最后更新时间,精确到s。
服务端相应的为
Last-modified
1.2 共享缓存
1.2.1 代理服务器缓存 (ISP(Internet Service Provider)
1.2.2 网关缓存 (CDN content delivery network)
多半是网站管理员部署,通常使用某种形式的负载均衡器,使多个网关看起来就像是原服务器。CDN(内容分发网络Content delivery network)为整个或部分网络分配网关缓存,然后把这些缓存卖给需要的网站。
2. 缓存的流程图

3. 缓存可能产生的问题
- 可能会造成资源更新不及时
建议更新资源的时候,更新资源名称
- 跟踪访问量不方便
可以以埋点的方式检测访问量,设置流量很小的请求不进行缓存