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

强制缓存vs协商缓存

强制缓存与协商缓存的区别

HTTP缓存机制
强制缓存
协商缓存
不与服务器通信\n直接使用本地缓存
先与服务器协商\n再决定是否使用缓存

⭐ 核心区别对比

特征强制缓存协商缓存
工作方式不与服务器通信,直接使用缓存先与服务器协商,再决定是否使用缓存
HTTP头部Cache-Control/ExpiresETag/If-None-MatchLast-Modified/If-Modified-Since
状态码200 (from cache)304 (Not Modified)
是否发请求否(缓存有效时)是(但只传输很小的元数据)
缓存控制精度时间维度内容维度
网络消耗小量请求/响应

🌟 缓存判断流程

有效
无效
浏览器发起请求
是否有缓存?
向服务器请求资源
强制缓存是否有效?
直接使用缓存
无需发送请求
是否有协商缓存标识?
发送条件请求到服务器
服务器判断缓存是否有效
返回304
使用本地缓存
返回200和新资源

强制缓存详解

强制缓存机制
Cache-Control
Expires
max-age=秒数\n缓存持续时间
no-cache\n需要协商验证
no-store\n禁止缓存
public/private\n共享/私有缓存
绝对过期时间\n(HTTP/1.0)

强制缓存的HTTP头部

// 服务器响应头部示例
Cache-Control: max-age=3600  // 缓存有效期1小时
Expires: Wed, 21 Oct 2022 07:28:00 GMT  // 具体过期时间(旧版)

当浏览器再次请求该资源时,如果缓存仍在有效期内:

  1. 无需发送请求
  2. 直接从缓存获取资源
  3. 状态码为200(但实际上是从缓存获取)

协商缓存详解

协商缓存机制
ETag/If-None-Match\n(基于内容)
Last-Modified/If-Modified-Since\n(基于时间)
服务器返回资源指纹\n客户端下次带上询问
服务器返回修改时间\n客户端下次询问是否有更新

协商缓存的HTTP头部

// 第一次请求,服务器响应头部
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2022 07:28:00 GMT// 再次请求,浏览器请求头部
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-Modified-Since: Wed, 21 Oct 2022 07:28:00 GMT

当浏览器再次请求该资源时:

  1. 发送请求到服务器(但只包含缓存校验信息)
  2. 服务器判断缓存是否有效
    • 若有效:返回304状态码(无响应体)
    • 若无效:返回200状态码和新资源
  3. 浏览器根据响应决定
    • 使用缓存(304)
    • 更新缓存(200)

💡 两种缓存机制的完整示例

强制缓存示例

// 首次请求
GET /style.css HTTP/1.1
Host: example.com// 服务器响应
HTTP/1.1 200 OK
Content-Type: text/css
Cache-Control: max-age=3600
Date: Mon, 01 Nov 2023 10:00:00 GMT
...// 一小时内再次请求 - 浏览器不发送请求到服务器
// 直接从缓存读取,网络面板可能显示(from disk cache)

协商缓存示例

// 首次请求
GET /script.js HTTP/1.1
Host: example.com// 服务器响应
HTTP/1.1 200 OK
Content-Type: application/javascript
ETag: "abc123"
Cache-Control: no-cache
Date: Mon, 01 Nov 2023 10:00:00 GMT
...// 再次请求 - 浏览器发送条件请求
GET /script.js HTTP/1.1
Host: example.com
If-None-Match: "abc123"// 若资源未修改,服务器响应
HTTP/1.1 304 Not Modified
Date: Mon, 01 Nov 2023 11:00:00 GMT
ETag: "abc123"
// 注意:无响应体,节省带宽

📊 应用场景对比

场景建议缓存策略原因
静态资源(JS/CSS)强制缓存+文件名Hash内容变化时文件名变化,确保总是最新
HTML页面协商缓存需要及时更新但又要减少带宽
API响应根据需求使用Cache-Control可能需要每次都获取最新数据
用户头像等强制缓存(长时间)更新不频繁,节省带宽
经常变化的资源协商缓存可能频繁变化但又需要缓存

🎯 最佳实践

最佳缓存策略
1. 结合使用两种缓存
2. 静态资源添加内容指纹
3. 合理设置有效期
4. 考虑服务器负载

📚 总结

  • ⚠️ 强制缓存:

    • 不与服务器通信,直接使用缓存
    • 通过Cache-ControlExpires控制
    • 返回200状态码(from cache)
    • 完全避免网络请求,性能最优
  • ⚠️ 协商缓存:

    • 与服务器协商是否使用缓存
    • 通过ETag/Last-Modified进行验证
    • 返回304状态码表示使用缓存
    • 需要发送请求,但可避免传输资源内容

两种缓存策略互为补充,合理结合使用可以显著提高网站性能,减少服务器负载和带宽消耗。

http://www.xdnf.cn/news/170479.html

相关文章:

  • pycharm无法创建venv虚拟环境
  • Web安全:威胁解析与综合防护体系构建
  • 快速排序及其在Unity游戏开发中的应用
  • Node.js API 安全的主要策略:最佳实践
  • 面试记录1-春招补录0427
  • 【Hive入门】Hive基础操作与SQL语法:DML操作全面解析
  • FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍
  • Reverse-WP记录6
  • Taro on Harmony :助力业务高效开发纯血鸿蒙应用
  • 云计算市场的重新分类研究
  • 华为 MRAG:多模态检索增强生成技术论文阅读
  • 用Node.js施展文档比对魔法:轻松实现Word文档差异比较小工具,实现Word差异高亮标注(附完整实战代码)
  • 如何删除Google Chrome中的所有历史记录【一键清除】
  • 关于Android Studio的Gradle各项配置2
  • 神经网络(自己记录)
  • 《大型网站技术架构-核心原理与案例分析》笔记
  • 展销编辑器在未来的发展前景​
  • 硬盘损坏数据恢复后对python程序的影响
  • Ant(Ubuntu 18.04.6 LTS)安装笔记
  • 20250427在ubuntu16.04.7系统上编译NanoPi NEO开发板的FriendlyCore系统解决问题mkimage not found
  • django filter 日期大于当前日期的
  • 4月27号
  • 数据结构强化篇
  • 游戏引擎学习第247天:简化DEBUG_VALUE
  • 从零开始了解数据采集(二十一)——电子制造行业趋势分析案例
  • 第十一章-PHP表单传值
  • Docker Python 镜像使用指南
  • CI/CD解决方案TeamCity在游戏开发中的应用价值与优势分析
  • 【计算机网络】网络基础概念
  • AI提示词(Prompt)终极指南:从入门到精通(附实战案例)