Interview AiBoxInterview AiBox 实时 AI 助手,让你自信应答每一场面试
请详细解释HTTP缓存机制中的强缓存和协商缓存的区别及工作原理?
题型摘要
HTTP缓存机制是Web性能优化的核心手段,分为强缓存和协商缓存。强缓存通过Expires和Cache-Control控制,直接使用本地缓存,不发送请求;协商缓存通过Last-Modified/If-Modified-Since和ETag/If-None-Match控制,需发送请求由服务器验证资源有效性。强缓存性能更优但更新不及时,协商缓存能及时更新但需发送请求。实际应用中,静态资源适合强缓存,动态内容适合协商缓存,合理配置可显著提升性能。
HTTP缓存机制:强缓存与协商缓存详解
HTTP缓存是Web性能优化的重要手段,通过缓存已获取的资源,可以减少网络请求,加快页面加载速度,降低服务器负载。HTTP缓存机制主要分为两种:强缓存和协商缓存。
强缓存
强缓存是指浏览器在请求资源时,不向服务器发送请求,直接从本地缓存中读取资源的过程。在强缓存生效期间,浏览器不会与服务器进行任何通信。
工作原理
当浏览器第一次请求某个资源时,服务器会在响应头中添加一些缓存控制字段。浏览器将这些资源连同响应头一起缓存起来。当浏览器再次请求该资源时,会先检查缓存是否过期,如果未过期,则直接使用缓存资源,不会向服务器发送请求。
相关HTTP头部字段
强缓存主要通过以下HTTP头部字段控制:
-
Expires
- 格式:
Expires: Wed, 21 Oct 2025 07:28:00 GMT - 表示资源的过期时间,是一个绝对时间
- 缺点:服务器时间和客户端时间可能不一致,导致缓存失效
- 格式:
-
Cache-Control
- 格式:
Cache-Control: max-age=31536000 - 表示资源的有效时间,是一个相对时间(单位:秒)
- 常用值:
max-age:资源最大有效时间no-cache:不使用强缓存,使用协商缓存no-store:不使用任何缓存public:资源可以被浏览器和CDN等中间服务器缓存private:资源只能被浏览器缓存,不能被CDN等中间服务器缓存must-revalidate:缓存过期后必须向服务器验证资源有效性
- 格式:
当Expires和Cache-Control同时存在时,Cache-Control的优先级更高。
优缺点
优点:
- 减少网络请求,提高页面加载速度
- 降低服务器负载
- 节省带宽
缺点:
- 资源更新后,在缓存过期前用户无法获取最新资源
- 需要合理设置缓存时间,否则可能导致用户体验问题
协商缓存
协商缓存是指浏览器在请求资源时,先向服务器发送请求,由服务器判断缓存是否可用,如果可用则返回304状态码,告诉浏览器使用缓存资源;如果不可用,则返回最新的资源。
工作原理
当浏览器第一次请求某个资源时,服务器会在响应头中添加一些用于验证资源有效性的字段。浏览器将这些资源连同响应头一起缓存起来。当浏览器再次请求该资源时,会在请求头中携带这些验证字段,服务器根据这些字段判断资源是否有更新,如果没有更新,则返回304状态码,告诉浏览器使用缓存资源;如果有更新,则返回最新的资源。
相关HTTP头部字段
协商缓存主要通过以下HTTP头部字段控制:
-
Last-Modified / If-Modified-Since
Last-Modified:服务器在响应头中添加,表示资源的最后修改时间,格式为Last-Modified: Wed, 21 Oct 2025 07:28:00 GMTIf-Modified-Since:浏览器在再次请求时,在请求头中添加,值为上次响应中的Last-Modified值,格式为If-Modified-Since: Wed, 21 Oct 2025 07:28:00 GMT- 服务器比较资源的最后修改时间和
If-Modified-Since值,如果一致,则返回304;否则返回200和最新资源
-
ETag / If-None-Match
ETag:服务器在响应头中添加,表示资源的唯一标识,格式为ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"If-None-Match:浏览器在再次请求时,在请求头中添加,值为上次响应中的ETag值,格式为If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"- 服务器比较资源的
ETag和If-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 |
| 资源获取方式 | 直接从缓存读取 | 需要服务器验证后决定是否使用缓存 |
| 资源更新及时性 | 较差(缓存过期前无法获取最新资源) | 较好(可以及时获取最新资源) |
| 服务器负载 | 无(不发送请求) | 较低(只验证不返回资源) |
| 网络消耗 | 无(不发送请求) | 较低(只发送请求头,不接收资源) |
缓存决策流程
下面是浏览器缓存决策的流程图:
应用场景
强缓存适用场景
-
静态资源:如CSS、JavaScript、图片等不经常变化的资源
- 示例:
Cache-Control: max-age=31536000(缓存一年)
- 示例:
-
版本化资源:通过文件名或URL参数标识版本
- 示例:
app.v1.2.3.js或app.js?v=1.2.3 - 即使设置了长期缓存,更新版本号后也能获取最新资源
- 示例:
-
第三方库:如jQuery、React等稳定的第三方库
- 示例:
Cache-Control: max-age=31536000, immutable
- 示例:
协商缓存适用场景
-
经常变化的HTML文件:需要及时更新,但希望减少不必要的传输
- 示例:使用
ETag或Last-Modified
- 示例:使用
-
API响应:数据可能随时变化,但希望减少不必要的数据传输
- 示例:REST API使用
ETag或Last-Modified
- 示例:REST API使用
-
动态生成的资源:内容可能变化,但不是每次请求都变化
- 示例:使用
ETag或Last-Modified
- 示例:使用
实际应用
服务器配置示例
- Nginx配置强缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
- Nginx配置协商缓存
location ~* \.html$ {
etag on;
expires -1;
add_header Cache-Control "no-cache";
}
- 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);
}
});
前端缓存策略
-
HTML文件:使用协商缓存或较短时间的强缓存
- 因为HTML文件经常变化,需要及时更新
-
CSS/JS文件:使用长期强缓存 + 文件名哈希
- 通过构建工具生成带哈希的文件名,如
app.a1b2c3d4.js - 内容变化时,文件名会变化,从而绕过缓存
- 通过构建工具生成带哈希的文件名,如
-
图片/字体等静态资源:使用长期强缓存
- 这些资源不经常变化,可以长期缓存
-
API请求:使用协商缓存
- 数据可能随时变化,但希望减少不必要的数据传输
总结
HTTP缓存机制是Web性能优化的重要手段,分为强缓存和协商缓存两种。强缓存直接使用本地缓存资源,不发送请求;协商缓存需要发送请求到服务器验证资源有效性。合理使用这两种缓存机制,可以在保证用户体验的同时,提高页面加载速度,降低服务器负载,节省带宽。在实际应用中,需要根据资源类型和更新频率,选择合适的缓存策略。
思维导图
Interview AiBoxInterview AiBox — 面试搭档
不只是准备,更是实时陪练
Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。
AI 助读
一键发送到常用 AI
HTTP缓存机制是Web性能优化的核心手段,分为强缓存和协商缓存。强缓存通过Expires和Cache-Control控制,直接使用本地缓存,不发送请求;协商缓存通过Last-Modified/If-Modified-Since和ETag/If-None-Match控制,需发送请求由服务器验证资源有效性。强缓存性能更优但更新不及时,协商缓存能及时更新但需发送请求。实际应用中,静态资源适合强缓存,动态内容适合协商缓存,合理配置可显著提升性能。
智能总结
深度解读
考点定位
思路启发
相关题目
请详细描述在浏览器中输入URL到页面完全呈现的整个过程中发生了什么?
浏览器输入URL到页面呈现的全过程包括:1) URL解析提取协议、域名等;2) DNS查询从多级缓存获取IP;3) TCP三次握手建立连接;4) 发送HTTP请求;5) 服务器处理请求;6) 返回HTTP响应;7) 浏览器渲染页面,包括构建DOM树、CSSOM树、执行JS、构建渲染树、布局、绘制和合成。整个过程涉及网络协议、浏览器渲染等多方面知识,理解这一流程对前端开发和性能优化至关重要。
从在浏览器输入URL到页面展示,整个过程是怎样的?
从在浏览器输入URL到页面展示,整个过程可分为:1) URL解析,识别协议、域名等;2) DNS域名解析,将域名转为IP地址;3) 建立TCP连接,通过三次握手;4) 发送HTTP请求,包含请求行、请求头和请求体;5) 服务器处理请求并返回响应;6) 浏览器解析渲染页面,包括构建DOM树、CSSOM树、渲染树,进行布局和绘制;7) 根据Connection头部决定是否保持连接。整个流程涉及网络通信、协议交互和页面渲染等多个方面,理解此过程对Web性能优化至关重要。
什么是浏览器的重排(Reflow)和重绘(Repaint)?它们对性能有什么影响?如何减少重排和重绘?
重排(Reflow)是浏览器重新计算元素几何属性的过程,重绘(Repaint)是重新绘制元素外观的过程。重排比重绘更消耗性能,且会触发重绘。减少重排重绘的方法包括:批量DOM操作、避免频繁读取布局信息、使用CSS transform代替位置属性、使用绝对定位、使用现代布局算法、创建合成层、减少复杂效果、使用硬件加速、虚拟DOM、事件防抖节流、CSS动画代替JS动画等。优化这些操作可以显著提升页面性能和用户体验。
当在浏览器中输入URL到页面最终呈现,整个过程经历了哪些步骤?请详细描述。
从输入URL到页面呈现的过程包括:1) URL解析,提取协议、域名等信息;2) DNS域名解析,将域名转换为IP地址;3) 建立TCP连接,通过三次握手建立连接;4) 发送HTTP请求,包含请求行、请求头和请求体;5) 服务器处理请求,执行业务逻辑和数据库操作;6) 返回HTTP响应,包含状态码、响应头和响应体;7) 浏览器解析渲染页面,构建DOM树、CSSOM树,进行布局、绘制和合成;8) 关闭TCP连接,通过四次挥手断开连接;9) 后续交互,处理用户操作和异步请求;10) 性能优化,通过各种策略提高加载和渲染速度。整个过程涉及网络通信、服务器处理和浏览器渲染三个主要环节。
请解释浏览器的渲染原理
浏览器渲染原理是将HTML、CSS和JavaScript转换为可见页面的过程。主要步骤包括:1)解析HTML构建DOM树;2)解析CSS构建CSSOM树;3)合并DOM和CSSOM为渲染树;4)布局(重排)计算元素位置和大小;5)绘制(重绘)将元素转为像素;6)合成将多个图层合并为最终图像。重排影响元素布局,开销大;重绘只影响外观,开销小。优化渲染的关键是减少重排重绘、优化CSS和JavaScript加载执行、优化关键渲染路径。现代浏览器采用并行加载、GPU加速、虚拟DOM等技术提升渲染性能。