18 缓存代理 - 浏览器和服务器缓存
缓存代理能够复用同系列下 16 浏览器和服务器缓存 中提到的缓存控制策略
- 
    总结 1、计算机领域里最常用的性能优化手段是 时空转换,也就是时间换空间或者空间换时间, HTTP缓存属于后者;2、缓存代理 是增加了缓存功能的代理服务,缓存源服务器的数据,分发给下游的客户端 3、 Cache-Control字段也可以控制缓存代理,常用的有private/s-maxage/no-transform等,同样必须配合Last-modified/ETag等字段才能使用4、缓存代理有时候也会带来负面影响,缓存不良数据,需要及时刷新或删除 

代理做了什么?
代理服务收到 源服务器 发来的响应数据后需要做两件事:
- 1、把报文转发给客户端
- 2、把报文存入自己的 Cache 里
服务端针对缓存代理新增的属性
但由于缓存代理只是一个数据的中转站,并不是真正的数据消费者和生产者,所以新增了一些属性来做约束
| 属性 | 作用 | 场景理解 | 
|---|---|---|
| 区分客户端/代理上的缓存 | — | — | 
| private | 表示缓存 只能在客户端保存,不能放在代理上与别人共享 | 例如响应报文里用 Set-Cookie | 
| public | 缓存完全开放,谁都可以存/用 | |
| 缓存失效后的重新验证也要区分开 | – | – | 
| must-revalidate | 只要客户端缓存过期就必须回 源服务器 验证 | |
| proxy-revalidate | 要求 代理的缓存过期后必须验证,客户端不必回源 | |
| 缓存的生存时间 | – | – | 
| s-maxage(s-share) | 限定 在代理上 能够存多久 | |
| max_age | 限定 在客户端 存多久 | |
| 针对代理的一个属性 | – | – | 
| no-transform | 禁止对缓存下来的数据做处理 | 比如把图片生成 png、webp等几种格式 | 
如下图是服务器端缓存控制策略,可以同时控制客户端和代理:

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

代理上的缓存清理
常用方法:使用自定义请求方法 PURGE,发给代理服务器,要求删除 URI 对应的缓存数据
- 
    为什么要清除缓存? 1、过期的数据 应该及时淘汰,避免占用空间 2、源站的资源有更新,需要删除旧版本,主动换成最新版(即刷新) 3、有时候会缓存了一些本 不该存储的信息,例如网络谣言或者危险链接,必须尽快把它们删除