浏览器的缓存机制

浏览器的缓存机制

1. 强缓存

强缓存是指在缓存期间不需要请求,直接使用缓存数据, 浏览器自己决定用不用缓存。

特点:

  • 不请求服务器,直接使用缓存数据
  • 如果缓存有效,返回 200 (from memory/disk cache)
  • 如果缓存失效,转为协商缓存或重新请求。

开起强缓存方式:

  • 设置 Cache-Control: max-age=<缓存时间(单位秒)>
  • 设置 Expires<日期>(旧方式,不推荐)

示例:

js 复制代码
Cache-Control: max-age=3600 //  # 缓存1小时

浏览器首次请求资源,缓存到内存/磁盘 -> 1 小时内再次请求资源 -> 浏览器直接读缓存,不请求服务器。

2. 协商缓存

协商缓存是指在缓存期间需要请求,由服务器决定是否使用缓存。

特点:

  • 请求服务器,由服务器决定是否使用缓存
  • 如果资源未变化:服务器返回 304 Not Modified(无响应体),浏览器用缓存。
  • 如果资源有变化:服务器返回 200 + 新数据。

开起协商缓存方式:

  1. Last-Modified + If-Modified-Since :

浏览器第一次请求资源时,服务器会在响应头中返回 Last-Modified 字段,表示资源的最后修改时间。

浏览器第二次请求资源时,会在请求头中带上 If-Modified-Since 字段,表示上次请求时资源的最后修改时间。

服务器收到请求后,会根据 If-Modified-Since 字段与资源的最后修改时间进行比对,如果相同,则返回 304 Not Modified,浏览器直接使用缓存;如果不同,则返回返回 200 + 新数据。

  1. Etag + cache-control: no-cache :

浏览器第一次请求资源时,服务器会在响应头中返回 Etag 字段,表示资源的唯一标识,并且在响应头中设置 cache-control: no-cache

浏览器第二次请求资源时,会在请求头中带上 If-None-Match 字段,表示上次请求时资源的 Etag

服务器收到请求后,会根据 If-None-Match 字段与资源的 Etag 进行比对,如果相同,则返回 304 Not Modified,浏览器直接使用缓存;如果不同,则返回返回 200 + 新数据。

  1. Etag + Cache-Control: max-age=0, must-revalidate

max-age=0指缓存立即过期 ​ must-revalidate指允许使用缓存,前提是先问服务器。

过程同上。

  1. Cache-Control: no-store

no-store 指不使用任何缓存,每次请求都要向服务器请求, 并且每次都返回 200 + 新数据。

  1. 仅用 ETag(无 Cache-Control):

如果服务器返回 ETagLast-Modified,但没有 Cache-Control,浏览器默认会先使用缓存,再向服务器验证 ​(类似 max-age=0)。

总结:

  • 静态数据(图片/css/js) → Cache-Control: max-age=31536000(长期缓存)。
  • 动态数据(动态 API 接口、实时数据) → Cache-Control: no-cache + ETag(每次验证)。
  • 短缓存动态数据(如新闻数据) → Cache-Control: max-age=60, must-revalidate(过期后验证)。
  • 敏感数据(如支付数据) → Cache-Control: no-store(完全不缓存)。
  • 旧系统兼容 → 仅 ETag / Last-Modified(可能缓存但会验证)。
相关推荐
恋猫de小郭7 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
牛奔8 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌13 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
崔庆才丨静觅14 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606114 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX14 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了14 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅14 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅15 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法15 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate