Web 缓存机制 与 缓存策略

1,484 阅读2分钟

[toc]

缓存的作用

  1. 减少带宽
  2. 降低原始服务器压力
  3. 降低距离,网络造成的延时问题

1. 类别

1.1 私有缓存

1.1.1 浏览器缓存

浏览器会在我们的硬盘上开辟一块控件来存储资源副本,一个请求从浏览器缓存里调出几乎是立即显现出来的,比如一张图片。 首页一般不会被缓存

Cache-Control
  1. no-cache 强制在缓存前发送带验证器的请求到服务器

备注:

  1. 具体实现和浏览器有关,在chrome中测试永远返回 200 OK,因为请求头中不会带有校验信息(不管请求头和响应头谁设置了)。但是Safari中,会先去验证。
  2. 从字面上看很容易把no-cache理解成‘不缓存’,但事实上代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,no-store才是真正的不缓存资源
  1. no-store 不缓存
  2. max-age( s ) 设置浏览器缓存的最大周期, 单位为秒

备注:

  1. 在缓存周期(新鲜期)内, 请求不会去访问服务端资源, 直接去缓存取副本资源,并返回状态200 from cache;
  2. 如果资源更新了, 缓存新内容, 返回 200;
  3. 过了新鲜期后,请求会带着验证器访问服务器, 如果资源没有变化, 则继续取的是缓存数据, 并返回304 Not Modified, 并更新新鲜度;
  4. 如果服务端已没有此资源, 删除缓存, 返回404;
  5. 如果参数为0,那么缓存服务器通常会将请求转向源服务器;
  1. s-maxage( s ) 设置所为用户共享缓存的缓存存储的最大周期,对于像同一个用户返回响应的服务器来说这个指令没有任何作用。
  2. Expires HTTP1.1 已经抛弃,建议用 max-age
验证器
  1. if-match 通常是数据内容的 mdn 值,由原始服务器生成。如果值与ETage值相同,才返回资源。(if-None-match与之相反)

服务端相应的为 ETag

  1. 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. 缓存可能产生的问题

  1. 可能会造成资源更新不及时

    建议更新资源的时候,更新资源名称

  2. 跟踪访问量不方便

    可以以埋点的方式检测访问量,设置流量很小的请求不进行缓存