强缓存和协商缓存的区别

557 阅读2分钟

强缓存和协商缓存是HTTP缓存机制中的两个关键策略,主要区别如下:

1. 是否发送请求

  • 强缓存:浏览器直接读取本地缓存,不发送请求到服务器。
  • 协商缓存:缓存失效后,浏览器向服务器发送请求,由服务器决定是否使用缓存。

2. HTTP状态码

  • 强缓存:返回 200 (from memory/disk cache),直接从本地加载资源。
  • 协商缓存:服务器返回 304 Not Modified,通知浏览器使用缓存副本。

3. HTTP头部字段

  • 强缓存
    • Expires(HTTP 1.0):绝对时间,可能因客户端时间误差失效。
    • Cache-Control(HTTP 1.1):常用 max-age=秒 设置相对时间,优先级高于 Expires
  • 协商缓存
    • Last-Modified(服务器返回) + If-Modified-Since(浏览器发送):基于资源修改时间(精度为秒)。
    • ETag(服务器返回) + If-None-Match(浏览器发送):基于资源唯一标识符(如哈希),精度更高,解决时间戳相同但内容不同的问题。

4. 优先级

  • 浏览器优先检查强缓存(如 Cache-ControlExpires),若有效则直接使用缓存。
  • 强缓存失效后,才触发协商缓存,通过 Last-Modified/ETag 向服务器验证。

5. 应用场景

  • 强缓存:适用于静态资源(如图片、CSS、JS),短期内不会修改。
  • 协商缓存:适用于频繁更新或需精准验证的资源(如用户个性化内容)。

示例流程

  1. 首次请求:服务器返回资源,并附加 Cache-Control: max-age=3600ETag: "abc123"
  2. 1小时内再次请求:强缓存生效,浏览器直接使用本地副本(状态码200 from cache)。
  3. 1小时后请求:强缓存失效,浏览器携带 If-None-Match: "abc123" 发起请求。若资源未变,服务器返回304,浏览器继续使用缓存;若已更新,返回200及新资源。

注意事项

  • 用户行为影响:强制刷新(如Ctrl+F5)会跳过强缓存,直接向服务器请求。
  • 组合使用:建议同时设置强缓存和协商缓存(如 Cache-Control + ETag),兼顾效率和准确性。

总结:强缓存通过本地判断减少请求,协商缓存通过服务器通信确保资源新鲜,两者协同提升网页性能。