http 缓存 强缓存与协商缓存

469 阅读2分钟

浏览器发起请求 ,服务器返回缓存标记(时间戳 or etag)给浏览器保存

大致流程

0.检查是否有缓存,
1.获得缓存授权, 强缓存or协商缓存
2.浏览器发送请求携带缓存标记, 服务器检查标记判断资源缓存是否到期
3.决定是否启用缓存or重新请求 

强缓存(200 form cache)

expires : 强缓存到期时间 绝对时间 , GMT 时间
cache-control: 控制缓存有效期 指相对时间
cache-control:{
max-age 到期时间
s-maxage 覆盖max-age,expires. 共享缓存
public 设置缓存公用 可被客户端 代理服务器缓存缓存
private 设置缓存私有 只能被客户端缓存 比如浏览器
no-cache 发送缓存校验
no-store 禁止缓存
}

优先级 cache-control>expires 

缓存的意义: 减少并发量, 节约企业成本 

协商缓存(304)

响应头返回 

last-modeify : 资源最后修改时间

请求头

 if-modify-since : 带上返回的 last-modeify

如果当前资源修改时间与服务器时间不一致 说明服务器资源数据有变更需要重新请求
原理:其实很简单 就类似diff算法 key一样的复用 不一样就更新
在这里 时间戳等价于key 

 响应头

 etag: 资源标识.

请求头

if-none-match:  上一次的etag标识

etag 与 last-modify 都是协商缓存的标识
区别在于last-modify比较可能不准确, 而etag通过文件资源()
确定标识,一般是唯一的, 文件资源一变etag肯定会变,所以etg准确很多

etag优先级>last-modify 

 优缺点比较:
last-modified: 不怎么占用服务器资源 符合大多数缓存场景

 缺点 :不准确 只能判断秒级更新

etag: 准确但是对于服务器来说可能开销大

 etag是作为last-modified的补充. 

总结:
通常情况last-modified够用,比如周期性变动的资源

如果要精确到秒级以下的资源 比如1s内可能修改了n次 那么用etag