1. 常见的缓存策略有哪些?
- 强缓存:通过设置 HTTP 头(如
Cache-Control和Expires)来告诉浏览器在一定时间内直接从缓存中加载资源,而不发送请求到服务器。 - 协商缓存:当强缓存失效时,浏览器会向服务器发送请求,服务器通过
Last-Modified和ETag等头信息来判断资源是否发生变化,如果没有变化,服务器返回 304 状态码,浏览器继续使用缓存。
2. HTTP 头中的Cache-Control有哪些常见的值?
max-age=3600:资源在 3600 秒内有效。no-cache:每次请求都要向服务器验证缓存是否有效。no-store:禁止缓存,每次请求都从服务器获取资源。public:资源可以被任何缓存(如 CDN)缓存。private:资源只能被客户端浏览器缓存。
3. Expires和Cache-Control有什么区别?
Expires是HTTP/1.0的字段 使用绝对时间 ,依赖客户端和服务器的时钟同步。Cache-Control是 HTTP/1.1 引入的, 使用相对时间 不受客户端时间影响,更可靠。Cache-Control比Expires优先级更高 更可靠。
4. ETag和Last-Modified有什么区别?
ETag是服务器为资源生成的唯一标识符,通常是一个哈希值,用于判断资源是否发生变化。Last-Modified是资源最后修改的时间戳。ETag比Last-Modified更精确,因为即使资源内容没有变化,时间戳也可能发生变化。
5. 如何强制浏览器不使用缓存?
- 可以通过设置 HTTP 头
Cache-Control: no-store或Cache-Control: no-cache来强制浏览器不使用缓存。 - 或者在 URL 中添加随机参数(如
?v=1)来绕过缓存。
6. CDN 缓存和浏览器缓存有什么区别?
- CDN 缓存:CDN(内容分发网络)将静态资源缓存到全球各地的边缘节点,用户访问时可以从最近的节点获取资源,减少延迟。
- 浏览器缓存:浏览器将资源缓存到本地,用户再次访问时可以直接从本地加载资源,减少网络请求。
7. 如何实现前端资源的版本控制?
- 可以通过在文件名或 URL 中添加版本号(如
app.v1.js)或哈希值(如app.a1b2c3.js)来实现前端资源的版本控制。当资源更新时,版本号或哈希值会发生变化,浏览器会重新下载新的资源。
8. 什么是内存缓存和磁盘缓存?
- 内存缓存:资源存储在内存中,读取速度快,但容量有限,通常在页面刷新后失效。
- 磁盘缓存:资源存储在磁盘中,容量较大,但读取速度相对较慢,可以在多次会话中保持。
9. 如何优化前端缓存策略?
- 对静态资源设置较长的缓存时间(如
max-age=31536000),并在资源更新时通过修改文件名或 URL 来强制浏览器下载新资源。 - 对动态资源使用
no-cache或max-age=0,确保每次请求都验证缓存的有效性。 - 使用 CDN 加速静态资源的加载,并合理配置 CDN 缓存策略。
10. 什么是缓存穿透、缓存击穿和缓存雪崩?
- 缓存穿透:请求的数据在缓存和数据库中都不存在,导致每次请求都直接访问数据库。
- 缓存击穿:某个热点数据在缓存中过期,导致大量请求同时访问数据库。
- 缓存雪崩:大量缓存数据在同一时间失效,导致大量请求直接访问数据库。