Skip to content

1. 常见的缓存策略有哪些?

  • 强缓存:通过设置 HTTP 头(如Cache-ControlExpires)来告诉浏览器在一定时间内直接从缓存中加载资源,而不发送请求到服务器。
  • 协商缓存:当强缓存失效时,浏览器会向服务器发送请求,服务器通过Last-ModifiedETag等头信息来判断资源是否发生变化,如果没有变化,服务器返回 304 状态码,浏览器继续使用缓存。

2. HTTP 头中的Cache-Control有哪些常见的值?

  • max-age=3600:资源在 3600 秒内有效。
  • no-cache:每次请求都要向服务器验证缓存是否有效。
  • no-store:禁止缓存,每次请求都从服务器获取资源。
  • public:资源可以被任何缓存(如 CDN)缓存。
  • private:资源只能被客户端浏览器缓存。

3. ExpiresCache-Control有什么区别?

  • Expires是HTTP/1.0的字段 使用绝对时间 ,依赖客户端和服务器的时钟同步。

  • Cache-Control是 HTTP/1.1 引入的, 使用相对时间 不受客户端时间影响,更可靠。

  • Cache-ControlExpires优先级更高 更可靠。

4. ETagLast-Modified有什么区别?

  • ETag是服务器为资源生成的唯一标识符,通常是一个哈希值,用于判断资源是否发生变化。

  • Last-Modified是资源最后修改的时间戳。

  • ETagLast-Modified更精确,因为即使资源内容没有变化,时间戳也可能发生变化。

5. 如何强制浏览器不使用缓存?

  • 可以通过设置 HTTP 头Cache-Control: no-storeCache-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-cachemax-age=0,确保每次请求都验证缓存的有效性。
  • 使用 CDN 加速静态资源的加载,并合理配置 CDN 缓存策略。

10. 什么是缓存穿透、缓存击穿和缓存雪崩?

  • 缓存穿透:请求的数据在缓存和数据库中都不存在,导致每次请求都直接访问数据库。
  • 缓存击穿:某个热点数据在缓存中过期,导致大量请求同时访问数据库。
  • 缓存雪崩:大量缓存数据在同一时间失效,导致大量请求直接访问数据库。