缓存策略
浏览器缓存是一种优化技术,通过将资源(如 HTML、CSS、JavaScript、图片等)存储在本地,减少重复请求和服务器负载,从而提升网页加载速度和用户体验。缓存策略的核心是决定哪些资源可以缓存、缓存多久以及何时更新缓存。
1. 缓存的作用
- 提升性能:减少网络请求,加快页面加载速度。
- 降低服务器负载:减少重复资源的请求,节省带宽。
- 离线访问:部分资源可以在离线状态下使用。
2. 缓存的类型
浏览器缓存主要分为以下几种类型:
2.1 强缓存(Strong Cache)
- 特点:直接从本地缓存中读取资源,不发送请求到服务器。
- 实现方式
- Expires:指定资源的过期时间(绝对时间)。
- Cache-Control:更灵活的缓存控制机制(相对时间)。
2.2 协商缓存(Conditional Cache)
- 特点:向服务器发送请求,验证资源是否过期。如果未过期,服务器返回 304 状态码,浏览器使用本地缓存。
- 实现方式
- Last-Modified / If-Modified-Since:基于资源的最后修改时间。
- ETag / If-None-Match:基于资源的唯一标识符。
3. 缓存的控制机制
浏览器缓存的控制主要通过 HTTP 头字段实现。以下是常见的缓存控制字段:
3.1 Expires
-
作用:指定资源的过期时间(绝对时间)。
-
示例
Expires: Wed, 21 Oct 2023 07:28:00 GMT -
问题
- 依赖客户端和服务端的时间同步。
- 无法动态调整缓存时间。
3.2 Cache-Control
-
作用:提供更灵活的缓存控制机制(相对时间)。
-
常用指令
max-age=<seconds>:资源的最大缓存时间(秒)。no-cache:强制协商缓存,每次请求都验证资源是否过期。no-store:禁止缓存,每次请求都从服务器获取资源。public:资源可以被任何中间节点(如 CDN)缓存。private:资源只能被客户端缓存。
-
示例
Cache-Control: max-age=3600, public
3.3 Last-Modified / If-Modified-Since
-
作用:基于资源的最后修改时间验证缓存。
-
流程
-
服务器返回资源时,附带
Last-Modified头字段。Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT -
客户端再次请求时,附带
If-Modified-Since头字段。If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT -
服务器检查资源是否修改:
- 如果未修改,返回 304 状态码,客户端使用缓存。
- 如果已修改,返回 200 状态码和新资源。
-
3.4 ETag / If-None-Match
-
作用:基于资源的唯一标识符验证缓存。
-
流程
-
服务器返回资源时,附带
ETag头字段。ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" -
客户端再次请求时,附带
If-None-Match头字段。If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4" -
服务器检查资源是否修改:
- 如果未修改,返回 304 状态码,客户端使用缓存。
- 如果已修改,返回 200 状态码和新资源。
-
4. 缓存的工作流程
以下是浏览器缓存的工作流程:
- 首次请求:
- 浏览器向服务器请求资源。
- 服务器返回资源,并附带缓存控制头字段(如
Cache-Control、Expires、Last-Modified、ETag等)。 - 浏览器根据缓存控制头字段决定是否缓存资源。
- 后续请求:
- 浏览器检查缓存是否有效:
- 如果缓存有效(未过期),直接使用缓存(强缓存)。
- 如果缓存无效(已过期),向服务器发送请求,验证资源是否修改(协商缓存)。
- 服务器根据验证结果返回 304 或 200 状态码。
- 浏览器检查缓存是否有效:
5. 缓存的更新机制
为了确保用户获取最新的资源,开发者需要合理设置缓存策略。以下是常见的缓存更新机制:
5.1 文件名哈希
- 原理:在文件名中加入哈希值(如
main.a1b2c3d4.js),当文件内容变化时,哈希值也会变化。 - 优点:强制浏览器获取新资源,同时保留旧资源的缓存。
5.2 版本号
- 原理:在 URL 中加入版本号(如
main.js?v=1.0.0),当版本号变化时,强制浏览器获取新资源。 - 优点:简单易用,适合小型项目。
5.3 手动清除缓存
- 原理:通过修改服务器配置或手动清除缓存,强制浏览器获取新资源。
- 优点:适用于紧急修复或特殊情况。
6. 缓存的注意事项
- 缓存时间:
- 静态资源(如图片、CSS、JavaScript)可以设置较长的缓存时间。
- 动态资源(如 HTML)应设置较短的缓存时间或不缓存。
- 缓存层级:
- 浏览器缓存:存储在客户端本地。
- 代理缓存:存储在中间节点(如 CDN)。
- 服务器缓存:存储在服务器端。
- 缓存一致性:
- 确保缓存策略的一致性,避免资源版本混乱。
- 缓存安全性:
- 敏感资源(如用户数据)应禁止缓存或设置为私有缓存。
7. 总结
- 浏览器缓存通过强缓存和协商缓存机制,提升网页加载速度和用户体验。
- 缓存的控制主要通过 HTTP 头字段(如
Cache-Control、Expires、Last-Modified、ETag等)实现。 - 开发者需要合理设置缓存策略,确保资源的及时更新和一致性。