Interview AiBox logo

Interview AiBox 实时 AI 助手,让你自信应答每一场面试

download免费下载
进阶local_fire_department38 次面试更新于 2025-08-23account_tree思维导图

请详细解释HTTP缓存机制中的强缓存和协商缓存的区别及工作原理?

lightbulb

题型摘要

HTTP缓存机制是Web性能优化的核心手段,分为强缓存和协商缓存。强缓存通过Expires和Cache-Control控制,直接使用本地缓存,不发送请求;协商缓存通过Last-Modified/If-Modified-Since和ETag/If-None-Match控制,需发送请求由服务器验证资源有效性。强缓存性能更优但更新不及时,协商缓存能及时更新但需发送请求。实际应用中,静态资源适合强缓存,动态内容适合协商缓存,合理配置可显著提升性能。

HTTP缓存机制:强缓存与协商缓存详解

HTTP缓存是Web性能优化的重要手段,通过缓存已获取的资源,可以减少网络请求,加快页面加载速度,降低服务器负载。HTTP缓存机制主要分为两种:强缓存协商缓存

强缓存

强缓存是指浏览器在请求资源时,不向服务器发送请求,直接从本地缓存中读取资源的过程。在强缓存生效期间,浏览器不会与服务器进行任何通信。

工作原理

当浏览器第一次请求某个资源时,服务器会在响应头中添加一些缓存控制字段。浏览器将这些资源连同响应头一起缓存起来。当浏览器再次请求该资源时,会先检查缓存是否过期,如果未过期,则直接使用缓存资源,不会向服务器发送请求。

相关HTTP头部字段

强缓存主要通过以下HTTP头部字段控制:

  1. Expires

    • 格式:Expires: Wed, 21 Oct 2025 07:28:00 GMT
    • 表示资源的过期时间,是一个绝对时间
    • 缺点:服务器时间和客户端时间可能不一致,导致缓存失效
  2. Cache-Control

    • 格式:Cache-Control: max-age=31536000
    • 表示资源的有效时间,是一个相对时间(单位:秒)
    • 常用值:
      • max-age:资源最大有效时间
      • no-cache:不使用强缓存,使用协商缓存
      • no-store:不使用任何缓存
      • public:资源可以被浏览器和CDN等中间服务器缓存
      • private:资源只能被浏览器缓存,不能被CDN等中间服务器缓存
      • must-revalidate:缓存过期后必须向服务器验证资源有效性

ExpiresCache-Control同时存在时,Cache-Control的优先级更高。

优缺点

优点

  • 减少网络请求,提高页面加载速度
  • 降低服务器负载
  • 节省带宽

缺点

  • 资源更新后,在缓存过期前用户无法获取最新资源
  • 需要合理设置缓存时间,否则可能导致用户体验问题

协商缓存

协商缓存是指浏览器在请求资源时,先向服务器发送请求,由服务器判断缓存是否可用,如果可用则返回304状态码,告诉浏览器使用缓存资源;如果不可用,则返回最新的资源。

工作原理

当浏览器第一次请求某个资源时,服务器会在响应头中添加一些用于验证资源有效性的字段。浏览器将这些资源连同响应头一起缓存起来。当浏览器再次请求该资源时,会在请求头中携带这些验证字段,服务器根据这些字段判断资源是否有更新,如果没有更新,则返回304状态码,告诉浏览器使用缓存资源;如果有更新,则返回最新的资源。

相关HTTP头部字段

协商缓存主要通过以下HTTP头部字段控制:

  1. Last-Modified / If-Modified-Since

    • Last-Modified:服务器在响应头中添加,表示资源的最后修改时间,格式为Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT
    • If-Modified-Since:浏览器在再次请求时,在请求头中添加,值为上次响应中的Last-Modified值,格式为If-Modified-Since: Wed, 21 Oct 2025 07:28:00 GMT
    • 服务器比较资源的最后修改时间和If-Modified-Since值,如果一致,则返回304;否则返回200和最新资源
  2. ETag / If-None-Match

    • ETag:服务器在响应头中添加,表示资源的唯一标识,格式为ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
    • If-None-Match:浏览器在再次请求时,在请求头中添加,值为上次响应中的ETag值,格式为If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
    • 服务器比较资源的ETagIf-None-Match值,如果一致,则返回304;否则返回200和最新资源

ETag的优先级高于Last-Modified,因为ETag能够更精确地判断资源是否有变化。

优缺点

优点

  • 能够及时获取到资源的最新版本
  • 减少不必要的数据传输,节省带宽
  • 降低服务器负载(不需要返回完整的资源内容)

缺点

  • 仍然需要发送HTTP请求到服务器
  • 相比强缓存,增加了一定的网络延迟

强缓存与协商缓存的区别

特性 强缓存 协商缓存
是否发送请求 不发送请求 发送请求
状态码 200 (from memory cache) 或 200 (from disk cache) 304 (Not Modified)
控制字段 Expires, Cache-Control Last-Modified/If-Modified-Since, ETag/If-None-Match
资源获取方式 直接从缓存读取 需要服务器验证后决定是否使用缓存
资源更新及时性 较差(缓存过期前无法获取最新资源) 较好(可以及时获取最新资源)
服务器负载 无(不发送请求) 较低(只验证不返回资源)
网络消耗 无(不发送请求) 较低(只发送请求头,不接收资源)

缓存决策流程

下面是浏览器缓存决策的流程图:

--- title: HTTP缓存决策流程 --- graph TD A[浏览器请求资源] --> B{强缓存是否有效?} B -->|是| C[使用缓存资源<br>200 (from cache)] B -->|否| D[发送请求到服务器<br>携带协商缓存字段] D --> E{服务器判断资源是否变化?} E -->|无变化| F[返回304状态码<br>浏览器使用缓存] E -->|有变化| G[返回200状态码和最新资源<br>浏览器更新缓存]

应用场景

强缓存适用场景

  1. 静态资源:如CSS、JavaScript、图片等不经常变化的资源

    • 示例:Cache-Control: max-age=31536000(缓存一年)
  2. 版本化资源:通过文件名或URL参数标识版本

    • 示例:app.v1.2.3.jsapp.js?v=1.2.3
    • 即使设置了长期缓存,更新版本号后也能获取最新资源
  3. 第三方库:如jQuery、React等稳定的第三方库

    • 示例:Cache-Control: max-age=31536000, immutable

协商缓存适用场景

  1. 经常变化的HTML文件:需要及时更新,但希望减少不必要的传输

    • 示例:使用ETagLast-Modified
  2. API响应:数据可能随时变化,但希望减少不必要的数据传输

    • 示例:REST API使用ETagLast-Modified
  3. 动态生成的资源:内容可能变化,但不是每次请求都变化

    • 示例:使用ETagLast-Modified

实际应用

服务器配置示例

  1. Nginx配置强缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}
  1. Nginx配置协商缓存
location ~* \.html$ {
    etag on;
    expires -1;
    add_header Cache-Control "no-cache";
}
  1. Express.js配置缓存
// 强缓存
app.use(express.static('public', {
    maxAge: '1y',
    setHeaders: (res, path) => {
        if (path.endsWith('.html')) {
            res.setHeader('Cache-Control', 'no-cache');
        }
    }
}));

// 协商缓存
app.get('/api/data', (req, res) => {
    const data = getData();
    const etag = generateETag(data);
    
    if (req.headers['if-none-match'] === etag) {
        res.status(304).end();
    } else {
        res.setHeader('ETag', etag);
        res.json(data);
    }
});

前端缓存策略

  1. HTML文件:使用协商缓存或较短时间的强缓存

    • 因为HTML文件经常变化,需要及时更新
  2. CSS/JS文件:使用长期强缓存 + 文件名哈希

    • 通过构建工具生成带哈希的文件名,如app.a1b2c3d4.js
    • 内容变化时,文件名会变化,从而绕过缓存
  3. 图片/字体等静态资源:使用长期强缓存

    • 这些资源不经常变化,可以长期缓存
  4. API请求:使用协商缓存

    • 数据可能随时变化,但希望减少不必要的数据传输

总结

HTTP缓存机制是Web性能优化的重要手段,分为强缓存和协商缓存两种。强缓存直接使用本地缓存资源,不发送请求;协商缓存需要发送请求到服务器验证资源有效性。合理使用这两种缓存机制,可以在保证用户体验的同时,提高页面加载速度,降低服务器负载,节省带宽。在实际应用中,需要根据资源类型和更新频率,选择合适的缓存策略。

account_tree

思维导图

Interview AiBox logo

Interview AiBox — 面试搭档

不只是准备,更是实时陪练

Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。

AI 助读

一键发送到常用 AI

HTTP缓存机制是Web性能优化的核心手段,分为强缓存和协商缓存。强缓存通过Expires和Cache-Control控制,直接使用本地缓存,不发送请求;协商缓存通过Last-Modified/If-Modified-Since和ETag/If-None-Match控制,需发送请求由服务器验证资源有效性。强缓存性能更优但更新不及时,协商缓存能及时更新但需发送请求。实际应用中,静态资源适合强缓存,动态内容适合协商缓存,合理配置可显著提升性能。

智能总结

深度解读

考点定位

思路启发

auto_awesome

相关题目

请详细描述在浏览器中输入URL到页面完全呈现的整个过程中发生了什么?

浏览器输入URL到页面呈现的全过程包括:1) URL解析提取协议、域名等;2) DNS查询从多级缓存获取IP;3) TCP三次握手建立连接;4) 发送HTTP请求;5) 服务器处理请求;6) 返回HTTP响应;7) 浏览器渲染页面,包括构建DOM树、CSSOM树、执行JS、构建渲染树、布局、绘制和合成。整个过程涉及网络协议、浏览器渲染等多方面知识,理解这一流程对前端开发和性能优化至关重要。

arrow_forward

从在浏览器输入URL到页面展示,整个过程是怎样的?

从在浏览器输入URL到页面展示,整个过程可分为:1) URL解析,识别协议、域名等;2) DNS域名解析,将域名转为IP地址;3) 建立TCP连接,通过三次握手;4) 发送HTTP请求,包含请求行、请求头和请求体;5) 服务器处理请求并返回响应;6) 浏览器解析渲染页面,包括构建DOM树、CSSOM树、渲染树,进行布局和绘制;7) 根据Connection头部决定是否保持连接。整个流程涉及网络通信、协议交互和页面渲染等多个方面,理解此过程对Web性能优化至关重要。

arrow_forward

什么是浏览器的重排(Reflow)和重绘(Repaint)?它们对性能有什么影响?如何减少重排和重绘?

重排(Reflow)是浏览器重新计算元素几何属性的过程,重绘(Repaint)是重新绘制元素外观的过程。重排比重绘更消耗性能,且会触发重绘。减少重排重绘的方法包括:批量DOM操作、避免频繁读取布局信息、使用CSS transform代替位置属性、使用绝对定位、使用现代布局算法、创建合成层、减少复杂效果、使用硬件加速、虚拟DOM、事件防抖节流、CSS动画代替JS动画等。优化这些操作可以显著提升页面性能和用户体验。

arrow_forward

当在浏览器中输入URL到页面最终呈现,整个过程经历了哪些步骤?请详细描述。

从输入URL到页面呈现的过程包括:1) URL解析,提取协议、域名等信息;2) DNS域名解析,将域名转换为IP地址;3) 建立TCP连接,通过三次握手建立连接;4) 发送HTTP请求,包含请求行、请求头和请求体;5) 服务器处理请求,执行业务逻辑和数据库操作;6) 返回HTTP响应,包含状态码、响应头和响应体;7) 浏览器解析渲染页面,构建DOM树、CSSOM树,进行布局、绘制和合成;8) 关闭TCP连接,通过四次挥手断开连接;9) 后续交互,处理用户操作和异步请求;10) 性能优化,通过各种策略提高加载和渲染速度。整个过程涉及网络通信、服务器处理和浏览器渲染三个主要环节。

arrow_forward

请解释浏览器的渲染原理

浏览器渲染原理是将HTML、CSS和JavaScript转换为可见页面的过程。主要步骤包括:1)解析HTML构建DOM树;2)解析CSS构建CSSOM树;3)合并DOM和CSSOM为渲染树;4)布局(重排)计算元素位置和大小;5)绘制(重绘)将元素转为像素;6)合成将多个图层合并为最终图像。重排影响元素布局,开销大;重绘只影响外观,开销小。优化渲染的关键是减少重排重绘、优化CSS和JavaScript加载执行、优化关键渲染路径。现代浏览器采用并行加载、GPU加速、虚拟DOM等技术提升渲染性能。

arrow_forward

阅读状态

阅读时长

8 分钟

阅读进度

6%

章节:17 · 已读:1

当前章节: 强缓存

最近更新:2025-08-23

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

面试中屏幕实时显示参考回答,帮你打磨表达。

免费下载download

分享题目

复制链接,或一键分享到常用平台

外部分享