18 缓存代理 - 浏览器和服务器缓存

Posted by CodingWithAlice on April 28, 2021

18 缓存代理 - 浏览器和服务器缓存

缓存代理能够复用同系列下 16 浏览器和服务器缓存 中提到的缓存控制策略

  • 总结

    1、计算机领域里最常用的性能优化手段是 时空转换,也就是时间换空间或者空间换时间,HTTP 缓存属于后者;

    2、缓存代理 是增加了缓存功能的代理服务,缓存源服务器的数据,分发给下游的客户端

    3、Cache-Control 字段也可以控制缓存代理,常用的有 private/s-maxage/no-transform等,同样必须配合 Last-modified/ETag 等字段才能使用

    4、缓存代理有时候也会带来负面影响,缓存不良数据,需要及时刷新或删除

image-20210428094900331

代理做了什么?

代理服务收到 源服务器 发来的响应数据后需要做两件事:

  • 1、把报文转发给客户端
  • 2、把报文存入自己的 Cache 里

服务端针对缓存代理新增的属性

但由于缓存代理只是一个数据的中转站,并不是真正的数据消费者和生产者,所以新增了一些属性来做约束

属性 作用 场景理解
区分客户端/代理上的缓存
private 表示缓存 只能在客户端保存,不能放在代理上与别人共享 例如响应报文里用 Set-Cookie
public 缓存完全开放,谁都可以存/用  
缓存失效后的重新验证也要区分开
must-revalidate 只要客户端缓存过期就必须回 源服务器 验证  
proxy-revalidate 要求 代理的缓存过期后必须验证,客户端不必回源  
缓存的生存时间
s-maxage(s-share) 限定 在代理上 能够存多久  
max_age 限定 在客户端 存多久  
针对代理的一个属性
no-transform 禁止对缓存下来的数据做处理 比如把图片生成 pngwebp 等几种格式

如下图是服务器端缓存控制策略,可以同时控制客户端和代理:

image-20210428095122844

客户端对代理新增的缓存控制

属性 作用
max-stale 如果代理上的 缓存过期了也可以接受,但不能过期太多,超过 x 秒也会不要
min-fresh 缓存必须有效,而且必须 在 x 秒后依然有效
only-if-cached 只接受代理缓存的数据,不接受源服务器的响应

image-20210428095215783

代理上的缓存清理

常用方法:使用自定义请求方法 PURGE,发给代理服务器,要求删除 URI 对应的缓存数据

  • 为什么要清除缓存?

    1、过期的数据 应该及时淘汰,避免占用空间

    2、源站的资源有更新,需要删除旧版本,主动换成最新版(即刷新)

    3、有时候会缓存了一些本 不该存储的信息,例如网络谣言或者危险链接,必须尽快把它们删除