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

http缓存

一、为什么要有 HTTP 缓存

  • 目的:减少网络请求,加快加载速度,降低服务器压力,提升用户体验。

  • 本质:浏览器在本地存储资源副本,下次请求时直接复用,或确认是否需要更新。


二、HTTP 缓存体系结构

HTTP 缓存可以分为 强缓存协商缓存 两大类。

1. 强缓存(不用问服务器)

  • 特点:命中时直接用本地副本,不会发请求。

  • 关键字段

    • Expires:HTTP/1.0 的方式,表示绝对过期时间。缺点是受客户端时间影响。

    • Cache-Control: max-age=秒数:HTTP/1.1 推荐,资源在多少秒内有效。

  • 命中效果:状态码 200 (from disk cache / memory cache)


2. 协商缓存(需要问服务器)

  • 特点:资源可能过期,但浏览器会带上缓存标识,请求服务器验证是否更新。

  • 关键字段

    • Last-Modified / If-Modified-Since

      • 服务器返回资源最后修改时间。

      • 浏览器下次请求时带上 If-Modified-Since,服务器对比,如果没改动返回 304 Not Modified

      • 缺点:时间精度秒级,文件内容没变但时间变了也会触发重新加载。

    • ETag / If-None-Match

      • 服务器返回文件内容的唯一标识(hash、版本号等)。

      • 浏览器下次请求时带上 If-None-Match,服务器比对标识是否一致。

      • 更精准,但计算和存储有开销。

  • 命中效果:状态码 304 Not Modified,资源走缓存,但请求-响应头仍会交互。


三、缓存策略优先级

浏览器缓存判定流程可以简化为:

  1. 是否有强缓存(Expires/Cache-Control)且未过期?

    • ✅ 命中 → 直接用本地副本。

    • ❌ 过期 → 进入协商缓存。

  2. 是否有协商缓存标识(ETag/Last-Modified)?

    • ✅ 发送请求,带上标识。

      • 资源没改 → 返回 304,用本地缓存。

      • 资源更新 → 返回 200,替换本地缓存。

    • ❌ 没有标识 → 只能重新请求。


四、常见 Cache-Control 指令

Cache-Control 是 HTTP 缓存的核心,支持多个指令组合:

  • 强缓存相关

    • max-age=秒数:资源在多少秒内新鲜。

    • s-maxage=秒数:专门给代理服务器缓存用(CDN)。

  • 是否可缓存

    • public:任何地方都可以缓存(浏览器、代理)。

    • private:只能浏览器缓存,代理不可缓存(如用户信息)。

    • no-store:彻底禁止缓存(敏感数据)。

    • no-cache:不是“不要缓存”,而是必须向服务器验证,即进入协商缓存。

  • 缓存行为控制

    • must-revalidate:一旦过期必须去服务器验证。

📌 示例:

Cache-Control: max-age=31536000, public

表示资源缓存 1 年,所有人都能用缓存。


五、缓存位置

浏览器缓存分层存放,命中优先级不同:

  1. Service Worker Cache(最高优先级,开发者可控)

  2. Memory Cache(内存缓存,页面关闭即失效)

  3. Disk Cache(磁盘缓存,长期有效)

  4. Push Cache(HTTP/2 特有,生命周期极短)


六、前端实战应用场景

1. 静态资源(JS/CSS/图片)

  • 文件名带 hash(如 app.abc123.js)。

  • 设置:

    Cache-Control: max-age=31536000, immutable
    
  • 文件更新时 hash 改变,自动失效,永远走强缓存。

2. HTML 文件

  • HTML 一般不做长期强缓存,因为要随时更新。

  • 设置:

    Cache-Control: no-cache
    
  • 浏览器每次都会请求服务器,但如果内容没变,返回 304。

3. API 数据

  • 视业务而定:

    • 静态数据(如字典表):可长时间缓存。

    • 动态数据(如用户信息):一般 no-cacheprivate, max-age=0


七、缓存调试方法

  1. Chrome DevTools → Network 面板

    • 看 Status:200 / 200 (from memory cache) / 304

    • 看 Response Headers:Cache-ControlETag 等。

  2. curl 命令模拟:

    curl -I https://example.com/app.js
    

八、总结口诀

  • 静态资源 → 强缓存 + 文件名 hash

  • HTML → 协商缓存

  • API → 按需策略(no-cache / private)

  • 公共数据 → CDN + public 缓存


要不要我帮你画一张 HTTP 缓存决策流程图(强缓存 → 协商缓存 → 新请求),这样你在面试或工作解释时更直观?

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

相关文章:

  • LobeChat知识库,小团队的选择,理解Embedding与向量数据库的关系
  • 解决Content Security Policy (CSP)问题
  • Java类加载机制
  • 软件使用教程(四):Jupyter Notebook 终极使用指南
  • 【iOS】关键字复习
  • javaScript变量命名规则
  • MySQL基础知识保姆级教程(四)视图与约束
  • Chrome 如何清除浏览器缓存
  • 【开题答辩全过程】以 基于SpringBoot的校园一卡通管理系统的设计与实现为例,包含答辩的问题和答案
  • ESP32驱动数字麦克风INMP441
  • A2A + MCP 的python实现的最小可运行骨架
  • Jmeter实现参数化的4种方式
  • 构建AI智能体:二十、妙笔生花:Gradio集成DashScope Qwen-Image模型实现文生图
  • 人脸识别备案的重要意义
  • ES6新特性:JavaScript的进化装备箱[特殊字符]
  • 记一次使用函数式接口
  • A股大盘数据-20250901 分析
  • GD32入门到实战25--独立看门狗
  • JAVA后端开发——MyBatis 结合 MySQL JSON 类型查询详解
  • 【STM32】贪吃蛇 [阶段 3] 增强模块结构(架构优化)
  • curl 介绍及使用教程
  • python爬虫之selenium库进阶(小白五分钟从入门到精通)
  • 基本渗透概念
  • Raft 协议在 Nacos 中的实现
  • 从零开始实现Shell | Linux进程调度实战
  • Product Hunt 每日热榜 | 2025-09-01
  • 基于YOLOv11的脑卒中目标检测及其完整数据集——推动智能医疗发展的新机遇!
  • 齿轮里的 “双胞胎”:分度圆与节圆
  • [React]监听Form中某个字段的变化
  • 微算法科技(NASDAQ:MLGO)张量网络与机器学习融合,MPS分类器助力顶夸克信号识别