当前位置: 首页 > news >正文

强缓存和协商缓存详解

强缓存和协商缓存是浏览器缓存机制的两种核心方式,用于提升网页加载速度、减少服务器压力。

一、什么是强缓存(Strong Cache)

定义:

强缓存指的是:浏览器在 不向服务器发送请求 的前提下,直接从缓存中读取资源。

关键响应头:

响应头字段说明
Cache-Control现代浏览器首选,控制资源缓存的方式和时长(优先级更高)
ExpiresHTTP/1.0 使用,指定资源过期的具体时间(绝对时间)

示例:

Cache-Control: max-age=3600

表示该资源在被请求后的 1小时内有效,这段时间内,浏览器 不会再向服务器发请求,直接从缓存中取资源。

应用场景:

  • 图片、CSS、JS 等静态资源(版本更新频率不高)
  • 加载速度要求高的页面资源

二、什么是协商缓存(Negotiated Cache / Conditional Cache)

定义:

当资源过期时(强缓存失效),浏览器会向服务器发出请求,但带上缓存标识。服务器判断资源是否更新:

  • 未更新 → 返回 304 Not Modified,使用本地缓存;
  • 已更新 → 返回新的资源(200 OK 和新内容)。

关键字段:

请求头:

请求头字段说明
If-Modified-Since上次服务器响应中的 Last-Modified 时间
If-None-Match上次响应的 ETag 值(资源内容的唯一标识)

响应头:

响应头字段说明
Last-Modified文件的最后修改时间
ETag文件的唯一标识(由服务器生成,优先级更高)

示例流程:

  1. 首次请求资源,响应头带:
ETag: "abc123"
  1. 下一次请求资源,请求头带:
If-None-Match: "abc123"
  1. 如果资源未变,服务器返回:
HTTP/1.1 304 Not Modified

浏览器用本地缓存。

应用场景:

  • 资源可能会更新但频率较低
  • 数据接口请求(如分页数据)
  • JS、CSS 等有版本控制的资源

三、强缓存与协商缓存的优先级

浏览器会按以下顺序判断是否使用缓存:

  1. 是否命中强缓存(如 Cache-Control)

    • 是 → 直接用缓存,不发请求

    • 否 → 进入协商缓存判断

  2. 是否命中协商缓存(如 If-None-Match)

    • 是 → 返回 304,不下载资源,只发轻量请求

    • 否 → 返回 200,下载新资源

四、应用策略推荐

类型缓存策略建议
静态资源强缓存(设置长时间 max-age + 加 hash)
动态请求数据协商缓存(启用 ETag / Last-Modified
HTML 文件不建议强缓存,协商缓存 + 控制更新频率
CDN 加速资源一般由 CDN 自动加 Cache-Control 策略

前端打包时推荐:

使用 Webpack/Vite 的 hash 文件名策略:

app.73ddfa.js

修改代码自动改变文件名,从而避免旧缓存(缓存穿透问题)。

五、如何查看缓存策略(以 Chrome 为例)

  1. 打开 DevTools → Network

  2. 刷新页面(建议勾选 “Disable cache” 测试后再取消)

  3. 查看资源请求状态:

    • from memory cache:内存缓存
    • from disk cache:磁盘缓存
    • 200:正常请求
    • 304:协商缓存命中

六、总结对比表

特点强缓存协商缓存
是否发送请求❌不发送✅发送
状态码无(直接读取缓存)304 Not Modified
浏览器是否使用本地缓存
触发条件Expires/Cache-ControlETag/Last-Modified
性能更好较好

七、内存缓存 vs 磁盘缓存 的区别

类型说明
内存缓存缓存在浏览器的内存中,生命周期短,标签页关闭即释放
磁盘缓存缓存在硬盘中,生命周期长,页面刷新、浏览器重启后仍可使用

八、是否使用磁盘/内存缓存的判断依据

浏览器会根据以下因素决定资源是否放入 内存缓存 还是 磁盘缓存:

存入内存缓存的典型条件:

  • 小文件(如小图标、小脚本)

  • 生命周期短、频繁访问的资源

  • 页面首次加载过程中的资源

  • 当前标签页使用的资源

存入磁盘缓存的典型条件:

  • 体积较大的资源(如视频、图片、JS/CSS)

  • 设置了较长过期时间的资源(Cache-Control: max-age=xxx)

  • 资源用于多个页面/标签页复用

  • 非私密资源(非 Cache-Control: no-store)

九、与强缓存/协商缓存的关系

  1. 强缓存会触发磁盘或内存缓存:

    • 浏览器决定使用强缓存后,会尝试从内存或磁盘读取缓存文件

    • 哪个缓存命中取决于:缓存位置 + 缓存是否仍在有效期

  2. 协商缓存则总是会发请求,所以它不影响“是否存在哪种缓存”,但可能依赖磁盘缓存提供的文件副本以减少加载成本

示例:

Cache-Control: no-store

浏览器完全不会缓存(内存或磁盘都不会)

Cache-Control: public, max-age=86400

强缓存 1 天,浏览器倾向于将其 存入磁盘

总结

问题答案
强缓存/协商缓存是否决定内存/磁盘缓存?❌ 不直接决定,但会影响浏览器是否使用缓存
什么决定资源存到哪里?✅ 由浏览器内部策略决定(文件大小、访问频率、生命周期等)
是否可以控制资源不被缓存?✅ 使用 Cache-Control: no-storePragma: no-cache
http://www.lryc.cn/news/584022.html

相关文章:

  • SQL进阶:自连接的用法
  • 深度探索:实时交互与增强现实翻译技术(第六篇)
  • 【郑大二年级信安小学期】Day9:XSS跨站攻击XSS绕过CSRF漏洞SSRF漏洞
  • 医院多部门协同构建知识库-指南库-预测模型三维网络路径研究
  • 【C++】第十四节—模版进阶(非类型模版参数+模板的特化+模版分离编译+模版总结)
  • OSPF实验以及核心原理全解
  • vue引入应用通义AI大模型-(一)前期准备整理思路
  • Vue+Element Plus 中按回车刷新页面问题排查与解决
  • Scala实现网页数据采集示例
  • AI 智能体:开启自动化协作新时代
  • 2025.07.09华为机考真题解析-第三题300分
  • CentOs 7 MySql8.0.23之前的版本主从复制
  • 树莓派5+Ubuntu24.04 LTS ROS2 N10P镭神激光雷达 保姆级教程
  • ubuntu server配置静态IP
  • java(2025/7/10)
  • 【LeetCode 热题 100】19. 删除链表的倒数第 N 个结点——双指针+哨兵
  • 如何把Arduino IDE中ESP32程序bin文件通过乐鑫flsah_download_tool工具软件下载到ESP32中
  • 【音视频】HTTP协议介绍
  • 文心大模型4.5开源测评:保姆级部署教程+多维度测试验证
  • day11-微服务面试篇
  • 20.4 量子安全加密算法
  • k8s集群中控制节点处于NotReady,怎么办?
  • 32多串300A保护板测试仪:新能源电池安全的核心守护者
  • RFID 系统在医疗行业的深度应用:从安全溯源到效率革命
  • 【K8S】Kubernetes 使用 Ingress-Nginx 基于 Cookie 实现会话保持的负载均衡
  • 突破传统局限:60G 3D毫米波雷达如何实现精准人体全状态检测?
  • WIFI协议全解析05:WiFi的安全机制:IoT设备如何实现安全连接?
  • 为了安全应该使用非root用户启动nginx
  • HCIA第一次实验报告:静态路由综合实验
  • go go go 出发咯 - go web开发入门系列(四) 数据库ORM框架集成与解读