欢迎光临本地信息咨询网
详情描述

HTTP缓存是Web开发面试中高频且核心的考点,理解它对于优化性能和解决问题至关重要。下面我将以面试回答的形式,为你系统解析HTTP缓存。

一、核心概念(一句话开场)

HTTP缓存是一种通过存储资源副本并在后续请求中复用的技术,旨在显著减少网络延迟、降低服务器负载、提升用户体验。

二、缓存位置(从哪里读缓存?)

强缓存(本地缓存)

  • 浏览器缓存:直接从内存或磁盘读取,速度最快。
  • 命中时,状态码为 200 (from memory/disk cache),完全不发送请求到服务器。

协商缓存(对比缓存)

  • 浏览器必须向服务器发送请求,验证本地副本是否仍可用。
  • 如果可用(缓存有效),服务器返回 304 Not Modified,浏览器使用本地缓存。
  • 如果不可用,服务器返回 200 和新资源。

三、关键HTTP头字段(如何控制缓存?)

这是面试重点,需要分两类说清楚。

1. 强缓存相关字段

浏览器检查这两个字段,决定是否使用强缓存。优先级:Cache-Control > Expires。

  • Cache-Control (HTTP/1.1, 相对时间,优先级高)

    • max-age=3600: 资源有效期为3600秒。
    • no-cache: 跳过强缓存,直接进入协商缓存流程。
    • no-store: 彻底禁用所有缓存,每次都要从服务器获取。
    • public: 允许代理服务器缓存。
    • private: 仅允许浏览器缓存。
    • immutable: 资源永不变,用户刷新也不发送验证。
  • Expires (HTTP/1.0, 绝对时间)

    • 指定资源过期的具体日期/时间。
    • 缺点:依赖客户端时间,时间不准会导致缓存错乱。
2. 协商缓存相关字段

成对出现,由服务器返回,用于验证。

  • Last-Modified / If-Modified-Since (基于修改时间)

    • 服务器在响应头中返回 Last-Modified (资源最后修改时间)。
    • 浏览器下次请求时,在请求头中带上 If-Modified-Since (这个时间)。
    • 服务器比较时间,如果没变,则返回 304。
    • 缺点:精度到秒;文件可能只是被touch,内容未变;分布式服务器时间可能不同步。
  • ETag / If-None-Match (基于资源标识,优先级更高)

    • 服务器在响应头中返回 ETag (通常是文件内容的哈希值,如 W/"xyz123")。
    • 浏览器下次请求时,在请求头中带上 If-None-Match (这个ETag值)。
    • 服务器比较ETag,如果匹配,则返回 304。
    • 优势:比时间更精准,能感知内容是否真变化。

四、完整的缓存决策流程图(必背!)

你可以这样描述或画图:

1. 浏览器发起资源请求。
2. 检查是否有强缓存(Cache-Control/Expires)。
   └─ 若有,且未过期 -> 直接从缓存读取 (200 from cache),流程结束。
   └─ 若没有或已过期 -> 进入步骤3。
3. 浏览器准备发起请求,检查是否有协商缓存标识(Last-Modified/ETag)。
   └─ 若没有 -> 直接向服务器请求新资源 (200)。
   └─ 若有 -> 在请求头中带上 `If-Modified-Since` 或 `If-None-Match`。
4. 服务器收到请求,验证缓存是否有效。
   └─ 若有效 -> 返回 304 Not Modified,浏览器使用本地缓存。
   └─ 若无效 -> 返回 200 和新资源,并更新响应头的缓存标识。

五、实际应用策略(如何配置?)

这是体现你工程能力的地方。

  • 不常变的静态资源(如JS/CSS库、图片)

    Cache-Control: public, max-age=31536000, immutable

    说明:设置超长缓存(1年),并加immutable避免用户刷新也请求。通过修改文件名(如添加hash指纹) 来强制更新。

  • 经常变动的资源(如HTML、API接口)

    Cache-Control: no-cache

    说明:让浏览器每次都和服务端验证,确保获取最新内容。

  • 私有或敏感数据

    Cache-Control: private, no-store

    说明:禁止任何缓存。

六、常见面试题(举一反三)

用户点击“刷新”按钮和“强制刷新”(Ctrl+F5)有什么区别?

  • 普通刷新:会走正常的缓存流程(强缓存 -> 协商缓存)。
  • 强制刷新:浏览器会在请求头中带上 Cache-Control: no-cache(甚至Pragma: no-cache),跳过所有缓存,直接从服务器获取。

为什么有了Last-Modified还要ETag?

  • 回答:解决Last-Modified的三个痛点(秒级精度、内容未变但时间变、服务器时间同步问题)。ETag能更精准地判断内容是否变化。

缓存存在哪里?内存和硬盘有什么区别?

  • 内存缓存:快速,但关闭Tab/浏览器可能失效。小资源、当前会话高频资源。
  • 磁盘缓存:持久化,容量大。大资源、低频资源。

如何更新一个被强缓存的资源?

  • 答案:改变资源的URL。最常用的是在文件名中嵌入内容哈希(如 app.a1b2c3.js),或添加版本号参数(?v=2)。这样会作为新资源请求。

CDN缓存和浏览器缓存是什么关系?

  • CDN是位于浏览器和源站之间的“超级缓存”。CDN节点也会遵循HTTP缓存规则。通常CDN会缓存 public 资源,并通过其自身的策略(如X-Cache)来管理。

七、回答技巧总结

  • 结构化:按“是什么 -> 在哪 -> 怎么控制 -> 怎么用”的逻辑展开。
  • 抓重点:清晰区分强缓存和协商缓存的流程和字段。
  • 懂原理:能说出 ETag 比 Last-Modified 好的原因。
  • 重实践:能给出不同场景下的配置策略,并说明“文件哈希”在缓存更新中的核心作用。

掌握以上内容,你不仅能应对绝大多数HTTP缓存的面试问题,还能展现出你对Web性能优化的深入理解。

相关帖子
更年期后,女性在职业生涯和个人兴趣发展上可能迎来哪些新机遇?
更年期后,女性在职业生涯和个人兴趣发展上可能迎来哪些新机遇?
当娱乐消费也在降级,人们如何寻找低成本甚至零成本的精神满足方式?
当娱乐消费也在降级,人们如何寻找低成本甚至零成本的精神满足方式?
二次抵押评估流程有什么不同?房子抵押贷款办理特殊环节
二次抵押评估流程有什么不同?房子抵押贷款办理特殊环节
残疾人证到期换证或等级变更,是否会影响两项补贴的领取资格?
残疾人证到期换证或等级变更,是否会影响两项补贴的领取资格?
揭秘隐性收费捆绑条款,看清附加服务、保险理财等强制约定
揭秘隐性收费捆绑条款,看清附加服务、保险理财等强制约定
深圳每月260元、广州150元,广东独生子女父母奖励为啥这么高?
深圳每月260元、广州150元,广东独生子女父母奖励为啥这么高?
马上消费金融利率,安逸花借款利息计算
马上消费金融利率,安逸花借款利息计算
在涉及遗产继承或抚养权纠纷时,出生医学证明能提供怎样的法律依据?
在涉及遗产继承或抚养权纠纷时,出生医学证明能提供怎样的法律依据?
智能玩具联网功能背后的数据安全与儿童隐私保护,家长应了解哪些知识?
智能玩具联网功能背后的数据安全与儿童隐私保护,家长应了解哪些知识?
个人债务优化重组申请流程有哪些步骤?从申请到落地全解析
个人债务优化重组申请流程有哪些步骤?从申请到落地全解析
汽车贷款期限包含宽限期吗?还款日与期限的计算
汽车贷款期限包含宽限期吗?还款日与期限的计算
除了便捷性,预制菜在执行的食品安全标准上与餐厅现做菜有何异同?
除了便捷性,预制菜在执行的食品安全标准上与餐厅现做菜有何异同?
写字楼门店抵押贷款负债率高怎么办?降低负债率提高批贷成功率
写字楼门店抵押贷款负债率高怎么办?降低负债率提高批贷成功率
商铺门面房抵押贷款保险必须买吗?财产保险与抵押贷款保险区别
商铺门面房抵押贷款保险必须买吗?财产保险与抵押贷款保险区别
面对2026年的市场环境,独立开发者应聚焦解决用户的哪些痛点?
面对2026年的市场环境,独立开发者应聚焦解决用户的哪些痛点?
别墅抵押贷款LPR怎么影响利率?LPR调整与月供变化关系解读
别墅抵押贷款LPR怎么影响利率?LPR调整与月供变化关系解读
如何通过角色扮演类玩具,有效培养孩子的同理心与情绪管理能力?
如何通过角色扮演类玩具,有效培养孩子的同理心与情绪管理能力?
过桥垫资让与担保效力?名为买卖实为借贷
过桥垫资让与担保效力?名为买卖实为借贷
别墅抵押贷款可以抵押给典当行吗?典当行别墅抵押贷款利弊
别墅抵押贷款可以抵押给典当行吗?典当行别墅抵押贷款利弊
公司经营贷款集团授信流程,企业集团统一授信
公司经营贷款集团授信流程,企业集团统一授信