Interview AiBox logo

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

download免费下载
3local_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

相关题目

请做一个自我介绍

自我介绍是面试的开场环节,应遵循"三段式"结构:基本信息与教育背景、核心能力与项目经验、求职动机与个人特质。重点突出与岗位相关的技能和经验,用具体数据和成果支撑,保持真诚自然的表达,控制在2-3分钟内。针对不同公司和岗位进行个性化调整,展示自己的匹配度和价值。

arrow_forward

你有什么问题想问我们公司或团队的吗?

面试结尾提问是展示面试者思考深度和职业素养的重要机会。应提前准备3-5个有深度的问题,围绕团队技术、个人成长、公司文化和业务发展四个方面。好的问题能体现你对公司的了解、对职位的重视以及你的职业规划,避免问基础信息类问题。

arrow_forward

请做一个自我介绍

自我介绍应遵循“我是谁-我为什么能胜任-我为什么想来”的逻辑框架。在“能胜任”部分,要通过STAR法则和量化结果来突出技术亮点和项目经验。在“想来”部分,要表达对华为技术、文化或业务的认同,展现匹配度和诚意。整个过程应简洁有力,控制在1-3分钟内。

arrow_forward

请做一个自我介绍

自我介绍是面试的开场环节,应简洁明了地展示个人基本信息、教育背景、项目经验、技术特长、个人特质和求职动机。优秀的自我介绍应结构清晰、重点突出,与应聘岗位高度匹配,并表达出对公司的了解和加入的强烈意愿。

arrow_forward

请做一个自我介绍,包括你的技术背景、项目经验和学习方向。

自我介绍应包含四个核心部分:个人背景、技术能力、项目经验和学习规划。技术背景需突出前端技术栈掌握程度;项目经验应选择代表性案例,说明技术实现和个人贡献;学习方向要体现职业规划与公司发展的契合度。整体表达应简洁有力,重点突出,时间控制在3-5分钟内。

arrow_forward

阅读状态

阅读时长

8 分钟

阅读进度

6%

章节:17 · 已读:1

当前章节: 强缓存

最近更新:2025-08-23

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

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

免费下载download

分享题目

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

外部分享