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控制,需发送请求由服务器验证资源有效性。强缓存性能更优但更新不及时,协商缓存能及时更新但需发送请求。实际应用中,静态资源适合强缓存,动态内容适合协商缓存,合理配置可显著提升性能。
智能总结
深度解读
考点定位
思路启发
相关题目
请做一个自我介绍
自我介绍是面试的开场环节,应遵循"三段式"结构:基本信息与教育背景、核心能力与项目经验、求职动机与个人特质。重点突出与岗位相关的技能和经验,用具体数据和成果支撑,保持真诚自然的表达,控制在2-3分钟内。针对不同公司和岗位进行个性化调整,展示自己的匹配度和价值。
你有什么问题想问我们公司或团队的吗?
面试结尾提问是展示面试者思考深度和职业素养的重要机会。应提前准备3-5个有深度的问题,围绕团队技术、个人成长、公司文化和业务发展四个方面。好的问题能体现你对公司的了解、对职位的重视以及你的职业规划,避免问基础信息类问题。
请做一个自我介绍
自我介绍应遵循“我是谁-我为什么能胜任-我为什么想来”的逻辑框架。在“能胜任”部分,要通过STAR法则和量化结果来突出技术亮点和项目经验。在“想来”部分,要表达对华为技术、文化或业务的认同,展现匹配度和诚意。整个过程应简洁有力,控制在1-3分钟内。
请做一个自我介绍
自我介绍是面试的开场环节,应简洁明了地展示个人基本信息、教育背景、项目经验、技术特长、个人特质和求职动机。优秀的自我介绍应结构清晰、重点突出,与应聘岗位高度匹配,并表达出对公司的了解和加入的强烈意愿。
请做一个自我介绍,包括你的技术背景、项目经验和学习方向。
自我介绍应包含四个核心部分:个人背景、技术能力、项目经验和学习规划。技术背景需突出前端技术栈掌握程度;项目经验应选择代表性案例,说明技术实现和个人贡献;学习方向要体现职业规划与公司发展的契合度。整体表达应简洁有力,重点突出,时间控制在3-5分钟内。