Cache Control 响应头
告诉客户端我这个http请求的response 可不可以缓存,以什么样的方式缓存
- privtae (客户端可以缓存)
- public(客户端和代理服务器可以缓存)
- cache-control:max-age=3418551
从服务器端返回的,代表的是缓存时间,缓存将在***秒后失效 - no-cache(缓存本次结果,下次请求的时候强制向服务端再验证一次)
- no-store(不缓存请求的任何返回内容)
有效性判断
- ETag
资源唯一标识,服务器端返回。由资源做一个MD5加密生成的。 - If-None-Match
客户端发送的匹配ETag标识符。用来与服务器缓存的ETag 结果进行对比。如果服务器返回304,则代表该资源有效可以继续使用。返回200则需要重新请求。 - Last-Modified
资源最后被修改时间,服务器端返回 - If-Modified-Since
客户端发送的匹配资源最后修改的时间标识符,大于Last-Modified 就有效,反之无效。如果服务器返回304,则代表该资源有效可以继续使用。返回200则需要重新请求。
浏览器的三种刷新方式
- 回车刷新或者a链接
看cache-control 中的max-age是否有效,有效则为from cache,若cache-control 中为no-cache 则进入缓存协商逻辑(看last-modiified 与 ETag) - F5 刷新或者Commond+R刷新
去掉cache-control 中的max-age 或者设置为0,然后进行缓存协商逻辑 - ctri+F5(Windows) 或者commond+shift+R 刷新
去掉cache-control和协商头,强制刷新。
协商机制
比较ETag与Last-Modified 到服务端,若结果不变则返回304 不返回数据,变化则返回200,返回数据。
CDN自定义缓存策略
- 可自定义目录过期时间
- 可自定义后缀名过期时间
- 可自定义对应权重
- 可通过界面或者API强制cdn 对应目录刷新(不一定确保成功,有数量限制)
静态资源部署策略(一)
- css.js,img等元素使用版本号部署 例如a.js?v=1.0,但是不便利,维护困难,html的cache-control 加上no-cache ,
- css.js,img等元素使用带摘要部署,例如a.js?v=45ewsda(用hash函数加上hashcode) 这样会出现先部署html 还是先部署资源的覆盖问题。
- css.js,img等元素使用摘要作文件名部署,例如:45ews.js.xo.新老版本可并存并可回滚,资源部署完成后再部署html。
在没有引入CDN的时候我们对静态文件页面进行一次压测:
样本:969 平均2169ms TPS 28