前言
url请求过程中,浏览器会根据缓存机制保存请求的资源。当浏览器再次请求相同的url时,会根据header标识判断是否使用缓存。
强缓存是浏览器本地缓存,根据缓存的cache-control和expires判断资源是否过期,未过期则不经过服务器请求,返回200。
协商缓存根据Etag和Last-modified判断是否有数据更新,是则读取浏览器缓存,更新请求header并返回304;否则经过服务器请求,返回200,更新数据和请求header。
第一次请求:
第二次请求:
强缓存(本地缓存)
1、特点
- 不发送请求到服务器
- 返回 200
from cache
- from memory cache
- 内存中读取
- 关闭页面随内存释放
- js、font、img
- from disk cache
- 硬盘中读取
- 不会随页面关闭而释放
- css(加载一次 disk -> memory)
- from memory cache
2、header字段
Cache-control : max-age=number(优先)http1.1
- no-cache 不是用本地缓存
- no-store 禁止缓存
- public 可被所有用户缓存:终端用户的浏览器、CDN等中间代理服务器
- private 终端用户的浏览器
Expires : GMT http1.0
- GMT > 发送请求的时间
协商缓存(由服务器决定)
1、特点
- 返回 304,not modified
- 通过服务器告知缓存可用
- 更新header信息,不更新返回数据
- header报文大小
2、header字段
- Etag/If-None-Match:string(优先) http1.1
- 资源唯一标识符,资源变化会更新
- 优点:更准确的控制缓存
- 精确到秒以下的粒度
- 内容不变,修改时间变化的情况下使用缓存
- Last-modified/If-Modified-Since: GMT
- GMT 最后修改时间 == 资源在服务器最后修改时间
- == 304 not modified,不返回资源内容,response header更新
- != 200,重新加载资源,header Last-modified更新
- GMT 最后修改时间 == 资源在服务器最后修改时间
缓存优化
1、三级缓存原理
- 内存 ↓ (强缓存)
- 硬盘 ↓ (强缓存)
- 网络请求 ↓
- 200 请求
- 304 (协议缓存,只更新header)
- 缓存到硬盘和内存
2、缓存优化思路
- 200 -> 304 -> 本地缓存
- 更新url版本号,使浏览器重新请求资源
- 文件级别的精确缓存控制
- 文件内容变化才变更url
- 将url改成带 文件摘要信息
- 静态资源CDN节点部署
- 性能优化:静态资源和动态网页分集群部署,静态资源部署到CDN节点
- 覆盖式发布:部署页面和部署资源的先后顺序:资源 -> 页面
- 非覆盖式发布
- 用文件摘要信息 对资源文件进行重命名,不覆盖原有的资源文件
- 全量部署静态资源,再灰度部署页面
3、静态资源缓存控制方案
- 配置超长时间的本地缓存:节省带宽
- 提高性能采用内容摘要作为缓存更新依据:精确的缓存控制
- 静态资源CDN部署: 优化网络请求
- 更新资源发布路径实现非覆盖式发布: 平滑升级
ps:from 大公司的缓存优化