HTTP缓存是Web开发面试中高频且核心的考点,理解它对于优化性能和解决问题至关重要。下面我将以面试回答的形式,为你系统解析HTTP缓存。
HTTP缓存是一种通过存储资源副本并在后续请求中复用的技术,旨在显著减少网络延迟、降低服务器负载、提升用户体验。
强缓存(本地缓存)
200 (from memory/disk cache)
协商缓存(对比缓存)
304 Not Modified
200
这是面试重点,需要分两类说清楚。
浏览器检查这两个字段,决定是否使用强缓存。优先级:Cache-Control > Expires。
Cache-Control (HTTP/1.1, 相对时间,优先级高)
Cache-Control
max-age=3600
no-cache
no-store
public
private
immutable
Expires (HTTP/1.0, 绝对时间)
Expires
成对出现,由服务器返回,用于验证。
Last-Modified / If-Modified-Since (基于修改时间)
Last-Modified
If-Modified-Since
304
touch
ETag / If-None-Match (基于资源标识,优先级更高)
ETag
If-None-Match
W/"xyz123"
你可以这样描述或画图:
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)有什么区别?
Pragma: no-cache
为什么有了Last-Modified还要ETag?
缓存存在哪里?内存和硬盘有什么区别?
如何更新一个被强缓存的资源?
app.a1b2c3.js
?v=2
CDN缓存和浏览器缓存是什么关系?
掌握以上内容,你不仅能应对绝大多数HTTP缓存的面试问题,还能展现出你对Web性能优化的深入理解。