浏览器发起请求 ,服务器返回缓存标记(时间戳 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