Js篇-面试题6-聊一下强缓存与协商缓存

本文介绍了HTTP缓存中的强缓存和协商缓存,阐述了它们的工作原理、相关Header字段及其作用。强缓存通过Expires和Cache-Control直接使用本地缓存,而协商缓存依赖Last-Modified和If-None-Match或ETag进行服务器验证。理解这些机制有助于优化网站性能和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽互不曾谋面,但希望能和您成为笔尖下的朋友

以读书,技术,生活为主,偶尔撒点鸡汤

不作,不敷衍,意在真诚吐露,用心分享

点击左上方,可关注本刊

标星公众号(ID:itclanCoder)

如果不知道如何操作

点击这里,标星不迷路

缓存的优点:

  • 减少了不必要的数据传输,节省带宽

  • 减少服务器的负担,提升网站性能

  • 加快了客户端加载网页的速度

  • 用户体验友好

缺点

资源如果有更改,会导致客户端不及时更新就会造成用户获取信息滞后

当浏览器去请求某个文件的时候,服务端就在respone header里面对该文件做了缓存配置。缓存的时间、缓存类型都由服务端控制

浏览器第一次请求时

浏览器后续在进行请求时

从上图可以知道,浏览器缓存包括两种类型,即强缓存(本地缓存)和协商缓存,浏览器在第一次请求发生后,再次请求时

  • 浏览器在请求某一资源时,会先获取该资源缓存的header信息,判断是否命中强缓存(cache-control)和expires信息,若命中,直接从缓存中获取资源信息,包括缓存header信息,本次请求根本就不会与服务器进行通信 请求头信息

* Accept: ""
* Accept-Encoding: gzip,deflate
* Accept-Language:zh-cn
* Connection: keep-alive
* Host
* Referer
* User-Agent

来自缓存的响应头的信息


<think>好的,我现在需要处理用户关于HTTP缓存,特别是协商缓存强制缓存面试题及答案的请求。首先,我要确保自己理解这两个概念的区别机制。强制缓存是浏览器直接从本地缓存中读取资源,不发送请求到服务器,而协商缓存则需要向服务器发送请求,验证资源是否过期,如果未过期则返回304状态码,继续使用缓存。 接下来,我应该组织常见的面试问题,覆盖基本概念、工作原理、使用场景、头部字段、状态码以及优缺点比较。比如,用户可能会被问到两者的区别,或者如何设置这些缓存策略。需要确保每个问题都有清晰的答案,并且答案中正确使用LaTeX格式,如状态码用$304$表示,头部字段用`Cache-Control`等。 然后,我需要参考用户提供的引用内容,特别是引用[2]提到的Spring Boot面试题的重要性,可能需要在答案中强调实际应用场景,比如结合淘宝的大数据量处理(引用[1])来说明缓存的必要性。但要注意,用户提供的引用可能HTTP缓存关联不大,所以可能需要谨慎引用,或者仅在适当的地方提及。 还要注意回答的结构,每个问题单独列出,答案部分要详细但不过于冗长,使用中文,并确保LaTeX语法正确。例如,独立公式如缓存有效期的计算可能需要用$$...$$格式,但大部分情况下行内公式使用$...$即可。 另外,用户要求生成相关问题,所以我需要列举几个相关的扩展问题,比如浏览器行为差异或实际应用中的问题,帮助用户进一步准备面试。 最后,检查是否有遗漏的关键点,比如缓存验证的头部字段(Last-Modified/If-Modified-SinceETag/If-None-Match),状态码304200的区别,以及如何通过HTTP头部设置缓存策略。同时,确保所有技术术语准确无误,并且答案符合用户要求的格式,如引用标识的正确添加。</think>### HTTP缓存机制详解:强制缓存协商缓存 #### 一、强制缓存 强制缓存通过`Cache-Control``Expires`字段实现,浏览器直接使用本地缓存资源,无需服务器通信。 1. **关键字段** - `Cache-Control: max-age=3600`表示缓存有效期3600秒 - `Expires: Wed, 21 Oct 2025 07:28:00 GMT`(HTTP/1.0字段,优先级低于Cache-Control) 2. **状态码** 强制缓存命中时返回$200$状态码,并在Chrome开发者工具显示`(from disk cache)`或`(from memory cache)`[^1]。 #### 二、协商缓存 当强制缓存失效时,浏览器携带验证信息请求服务器,返回$304$(Not Modified)时复用缓存。 1. **验证机制** - **时间戳验证** ```http # 响应头 Last-Modified: Thu, 16 Jul 2020 05:33:22 GMT # 请求头 If-Modified-Since: Thu, 16 Jul 2020 05:33:22 GMT ``` - **内容指纹验证** ```http # 响应头 ETag: "627af4d0-15c3a" # 请求头 If-None-Match: "627af4d0-15c3a" ``` ETag优先级高于Last-Modified[^1]。 2. **典型流程** $$ \text{客户端请求} \xrightarrow{\text{携带验证头}} \text{服务器} \xrightarrow{\text{资源未修改}} 304 \rightarrow \text{使用缓存} $$ #### 三、对比选型 | 缓存类型 | 网络请求 | 响应码 | 适用场景 | |----------|----------|--------|-------------------------| | 强制缓存 | 无 | 200 | 静态资源(如图片/CSS) | | 协商缓存 | 有 | 304 | 频繁更新的业务数据 | #### 四、面试高频问题 1. **如何设置永久缓存?** ```http Cache-Control: public, max-age=31536000 ``` 配合内容哈希文件名(如`app.3a7b8c.js`),实现版本更新自动失效。 2. **ETagLast-Modified的差异?** - ETag可识别内容字节级变化,Last-Modified最小精度为秒级 - 分布式服务器场景中ETag计算需注意一致性 3. **缓存优先级问题** 强制缓存 > 协商缓存 > 服务端新资源 #### 五、实际应用案例 淘宝商品详情页的图片资源使用强制缓存,而价格数据通过协商缓存验证更新频率,实现TB级数据高效访问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值