一 什么是强缓存和协商缓存?它们之间有何区别?
强缓存(也称为无协商缓存) 是一种缓存策略,允许浏览器在满足特定条件下直接使用本地缓存的资源,而不必向服务器发送请求确认资源是否是最新的。这种机制减少了不必要的网络通信,提高了页面加载速度。强缓存的依据主要来自于HTTP响应头中的Cache-Control
和Expires
字段。
- Cache-Control: 通过
max-age
指令定义资源可以被缓存多久,从响应被接收那一刻算起。 - Expires: 指定资源何时过期,是一个绝对时间戳。如果当前时间小于Expires时间,资源就被认为是新鲜的。
当资源在强缓存有效期内,浏览器直接从本地缓存加载,不会与服务器交互,网络面板中这类请求通常显示状态码为200(从缓存中成功获取)。
协商缓存(也称条件式缓存) 发生在强缓存过期后,此时浏览器会向服务器发送请求,询问资源是否已更新。协商缓存的决策基于资源的某些特性(如修改时间或唯一标识),而不是简单地依赖于时间期限。主要涉及以下HTTP头部:
- Last-Modified: 服务器在响应中提供资源最后修改的时间。浏览器下次请求时,会在请求头中携带
If-Modified-Since
,服务器比较这个时间和资源实际的最后修改时间,以决定是否返回新内容。 - ETag (Entity Tag): 服务器为每个资源生成一个唯一的标识(ETag)。浏览器下次请求时,会在请求头中携带上次接收到的ETag(通过
If-None-Match
字段),服务器比较ETag来判断资源是否一致。
如果资源未改变,服务器会返回一个304 Not Modified状态码,指示浏览器可以继续使用本地缓存的版本;如果资源已改变,则服务器会返回新的资源内容及新的Last-Modified或ETag。
区别总结:
数据来源与交互:
- 强缓存完全在本地处理,不与服务器交互。
- 协商缓存涉及客户端与服务器的交互,以判断是否使用缓存。
性能影响:
- 强缓存减少网络延迟,提升性能。
- 协商缓存虽然比完全重新下载资源快,但仍需网络往返时间。
状态码:
- 强缓存成功时不与服务器交互,状态码为200(从缓存中)。
- 协商缓存未变更资源时,服务器返回304状态码。
控制粒度:
- 强缓存基于时间限制,较为固定。
- 协商缓存基于资源变化,更加灵活准确。
通过结合使用强缓存和协商缓存,网站可以实现既快速响应用户请求,又能确保用户获得最新的内容。