以下是关于强缓存和协商缓存的面试题总结:
1. 强缓存和协商缓存的定义
- 强缓存:当浏览器请求资源时,直接从本地缓存中获取资源,而无需向服务器发送请求。强缓存的实现主要依赖于 HTTP 响应头中的
Cache-Control
和Expires
字段。 - 协商缓存:当强缓存失效后,浏览器会向服务器发送请求,携带缓存标识(如
Last-Modified
或ETag
),服务器根据这些标识判断资源是否发生变化。如果资源未变化,服务器返回304 Not Modified
状态码,浏览器继续使用本地缓存。
2. 强缓存和协商缓存的实现方式
- 强缓存:
Expires
:HTTP 1.0 中的字段,指定资源的绝对过期时间。Cache-Control
:HTTP 1.1 中的字段,提供了更灵活的缓存策略,如max-age
(缓存有效期)、no-cache
(不直接使用强缓存,需协商验证)、no-store
(不使用缓存)。
- 协商缓存:
Last-Modified
和If-Modified-Since
:服务器返回资源的最后修改时间,浏览器在后续请求中携带该时间戳进行验证。ETag
和If-None-Match
:服务器返回资源的唯一标识符,浏览器在后续请求中携带该标识符进行验证。
3. 强缓存和协商缓存的区别
- 请求过程:
- 强缓存:直接从本地缓存获取资源,不发送请求。
- 协商缓存:需要向服务器发送请求,由服务器决定是否使用缓存。
- 适用场景:
- 强缓存适用于静态资源(如图片、CSS、JS 文件),这些资源不经常更新。
- 协商缓存适用于动态资源或更新频繁的资源,能够及时获取最新内容。
- 响应状态码:
- 强缓存生效时,响应状态码为
200
(直接使用缓存)。 - 协商缓存生效时,响应状态码为
304 Not Modified
。
- 强缓存生效时,响应状态码为
4. 强缓存和协商缓存的优先级
- 强缓存的优先级高于协商缓存。如果强缓存生效,浏览器不会发送请求到服务器;如果强缓存失效,才会进入协商缓存阶段。
5. 如何设置强缓存和协商缓存
- 强缓存:
Cache-Control: max-age=3600
(资源缓存有效期为 1 小时)。Expires: Wed, 21 Jul 2023 17:00:00 GMT
(资源过期时间为指定时间)。
- 协商缓存:
- 服务器响应头设置
Last-Modified
和ETag
。 - 浏览器请求头携带
If-Modified-Since
和If-None-Match
。
- 服务器响应头设置
6. 注意事项
- 强缓存:如果服务器时间设置不准确,可能导致缓存失效。
- 协商缓存:虽然需要与服务器通信,但减少了不必要的数据传输。
掌握这些知识点可以帮助你在面试中更好地回答关于 HTTP 缓存机制的问题。