Lazy loaded image
前端面试常问的HTTP缓存你都搞明白了吗?
Words 1327Read Time 4 min
2025-5-29
2025-5-29
type
status
date
slug
summary
tags
category
icon
password

在前面

HTTP缓存 是浏览器或代理服务器对之前请求过的资源进行存储,当再次请求相同资源时,可以直接从本地缓存中获取,避免重复向服务器发起请求的机制,可显著减少网络传输量、降低服务器负载、提升用户体验。

核心流程

首次请求

客户端向服务器请求资源,服务器返回资源及缓存控制头(如 Cache-ControlExpires),浏览器将资源存储到本地缓存。

后续请求

客户端再次请求相同资源时,优先检查本地缓存:
  • 若缓存有效:直接返回缓存资源(状态码 200 OK,标注 from cache)。
  • 若缓存过期:向服务器发送验证请求(携带 If-None-Match/If-Modified-Since),服务器判断资源是否更新:
    • 未更新:返回 304 Not Modified,浏览器使用本地缓存。
    • 已更新:返回新资源及新缓存规则。

缓存策略

强制缓存

浏览器根据响应头中的 Cache-Control 判断缓存是否过期,无需向服务器发送请求。
notion image
Cache-Control(HTTP/1.1 标准字段)
  • public:允许浏览器和代理服务器缓存(如 CDN)。
  • private:仅允许浏览器缓存(默认值)。
  • max-age=秒数:缓存有效期(如 max-age=3600 表示 1 小时内有效)。
  • no-cache并非禁止缓存,而是需要先验证(与协商缓存配合使用)。
  • no-store禁止缓存,每次请求必须从服务器获取资源(用于敏感数据)。
可以通过max-age来设置有效时间,我们来写个例子看看就知道了

服务端

这里我们用node简单起一个服务就好,在public目录中简单准备一个css文件
启动服务
notion image

css文件

css中就简单设置了一个样式
notion image

html

html 中通过服务端请求 css 文件
notion image

首次请求

notion image
通过上图可以看到第一次的资源是通过请求服务器拿到的,看看服务器接收到请求的时间
notion image

后续请求

缓存有效

notion image
在上图我们可以看到第二次请求css文件的时候是直接使用本地磁盘缓存的文件,服务端并没有接收到第二次请求
notion image
这时候我们修改css文件内容的话,页面也不会更新
notion image
notion image
强制刷新(ctrl+f5)才可以重新请求服务端资源:
notion image
notion image

缓存失效

如果缓存过了max-age中我们设置的时间,那缓存就会失效,这时候会重新请求服务端资源,并更新缓存,现在我们将缓存过期时间设置短一点试试
设置成10s,然后重新启动一下服务
notion image
notion image
notion image
从上面图片可以看到10s内的请求是取的缓存数据,超过10s后就会重新请求服务器资源并更新缓存数据。
notion image

协商缓存

浏览器发送请求时携带缓存标识(ETag/Last-Modified),服务器根据标识判断是否返回新资源。
notion image
  1. ETag/If-None-Match(精确匹配)
  • 服务器通过 ETag 返回资源的唯一标识(如文件哈希值)。
  • 浏览器下次请求时携带 If-None-Match: <ETag值>,服务器对比标识:
    • 一致:返回 304 Not Modified
    • 不一致:返回新资源及新 ETag
  1. Last-Modified/If-Modified-Since(时间匹配)
  • 服务器通过 Last-Modified 返回资源最后修改时间(如 Last-Modified: Thu, 22 May 2025 12:00:00 GMT)。
  • 浏览器下次请求时携带 If-Modified-Since: <时间值>,服务器对比时间:
    • 未修改:返回 304 Not Modified
    • 已修改:返回新资源及新 Last-Modified

服务端

notion image

首次请求

notion image

再次请求

缓存有效

不修改css文件内容再次请求文件时,可以看到请求的状态码是304
notion image
notion image

缓存失效

我们修改一下css文件在重新打开网页试试,这时候请求到的是最新的css文件
notion image
notion image
作者:JYeontu
上一篇
作为普通人,如何方便地用上最前沿的 AI 工具?
下一篇
前端常说的SSR 和 SSG到底是个啥?5分钟帮你搞懂!