强缓存和协商缓存是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-Control或Expires),若有效则直接使用缓存。 - 强缓存失效后,才触发协商缓存,通过
Last-Modified/ETag向服务器验证。
5. 应用场景
- 强缓存:适用于静态资源(如图片、CSS、JS),短期内不会修改。
- 协商缓存:适用于频繁更新或需精准验证的资源(如用户个性化内容)。
示例流程
- 首次请求:服务器返回资源,并附加
Cache-Control: max-age=3600和ETag: "abc123"。 - 1小时内再次请求:强缓存生效,浏览器直接使用本地副本(状态码200 from cache)。
- 1小时后请求:强缓存失效,浏览器携带
If-None-Match: "abc123"发起请求。若资源未变,服务器返回304,浏览器继续使用缓存;若已更新,返回200及新资源。
注意事项
- 用户行为影响:强制刷新(如Ctrl+F5)会跳过强缓存,直接向服务器请求。
- 组合使用:建议同时设置强缓存和协商缓存(如
Cache-Control+ETag),兼顾效率和准确性。
总结:强缓存通过本地判断减少请求,协商缓存通过服务器通信确保资源新鲜,两者协同提升网页性能。