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