强缓存与协商缓存的实现机制
文章目录
- 前言
- **1. 强缓存(强制缓存)**
- **强缓存生效流程**:
- **2. 协商缓存(对比缓存)**
- **协商缓存生效流程**:
- **对比总结**
- **实际应用建议**
- **1. 缓存配置的三种主要实现方式**
前言
强缓存与协商缓存的实现机制
1. 强缓存(强制缓存)
特点:浏览器直接从本地缓存读取资源,不发送请求到服务器。
实现方式:通过 Cache-Control
和 Expires
响应头控制。
(1) Cache-Control
(HTTP/1.1 标准,优先级更高)
• 常见指令:
• max-age=<seconds>
:缓存有效期(如 max-age=3600
表示 1 小时内有效)。
• no-cache
:不使用强缓存,直接进入协商缓存(向服务器验证)。
• no-store
:完全禁用缓存,每次请求都重新获取资源。
• public
:允许代理服务器缓存(默认 private
仅浏览器缓存)。
• immutable
:资源永不变,浏览器直接使用缓存(适用于版本化文件名如 main.a1b2c3.js
)。
• 示例:
Cache-Control: public, max-age=3600
(2) Expires
(HTTP/1.0 遗留,优先级低于 Cache-Control
)
• 指定一个绝对过期时间(GMT 格式),若本地时间超过该时间则缓存失效。
• 示例:
Expires: Wed, 21 Oct 2025 07:28:00 GMT
强缓存生效流程:
- 浏览器请求资源时,检查
Cache-Control
/Expires
。 - 若未过期,直接从 内存缓存(Memory Cache) 或 磁盘缓存(Disk Cache) 加载,HTTP 状态码显示 200 (from cache)。
- 若已过期,进入协商缓存流程。
2. 协商缓存(对比缓存)
特点:浏览器向服务器验证缓存是否有效,可能返回 304(Not Modified) 继续使用缓存。
实现方式:通过 Last-Modified
/If-Modified-Since
和 ETag
/If-None-Match
两组头部控制。
(1) Last-Modified
+ If-Modified-Since
• 服务器返回 Last-Modified
:资源的最后修改时间(GMT 格式)。
• 浏览器下次请求:携带 If-Modified-Since
(值为上次的 Last-Modified
)。
• 服务器检查:
• 若资源未修改(时间未变),返回 304 Not Modified,浏览器使用缓存。
• 若已修改,返回 200 OK 和新资源。
• 示例:
# 首次请求(服务器响应)
Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT# 再次请求(浏览器携带)
If-Modified-Since: Wed, 21 Oct 2025 07:28:00 GMT
(2) ETag
+ If-None-Match
(更精准)
• 服务器返回 ETag
:资源的唯一标识符(如哈希值)。
• 浏览器下次请求:携带 If-None-Match
(值为上次的 ETag
)。
• 服务器检查:
• 若 ETag
匹配,返回 304 Not Modified。
• 若不匹配,返回 200 OK 和新资源。
• 示例:
# 首次请求(服务器响应)
ETag: "33a64df551425fcc55e4d42a148795d9"# 再次请求(浏览器携带)
If-None-Match: "33a64df551425fcc55e4d42a148795d9"
协商缓存生效流程:
-
浏览器发现强缓存失效(或
no-cache
),携带If-Modified-Since
或If-None-Match
向服务器发起请求。 -
服务器验证资源是否变化:
• 未变化 → 返回 304,浏览器使用缓存。• 已变化 → 返回 200 和新资源。
对比总结
缓存类型 | 实现方式 | 优先级 | 特点 |
---|---|---|---|
强缓存 | Cache-Control /Expires | 高 | 直接读缓存,不请求服务器。 |
协商缓存 | Last-Modified /ETag | 低 | 需向服务器验证,可能返回 304。 |
实际应用建议
-
静态资源(如 JS/CSS/图片):
• 使用强缓存 + 文件名哈希(如main.a1b2c3.js
),设置Cache-Control: max-age=31536000, immutable
。 -
动态资源(如 API 数据):
• 使用Cache-Control: no-cache
+ETag
,确保实时性。 -
避免缓存问题:
• 修改资源时更新文件名或 URL 参数(如?v=2
)。
通过合理配置,可显著减少网络请求,提升页面加载速度! 🚀
1. 缓存配置的三种主要实现方式
(1) 后端代码控制(如Node.js/Java/Python)
适用场景:动态API、需要业务逻辑判断是否缓存。
示例(Node.js Express):
app.get('/data', (req, res) => {// 强缓存:1小时有效res.set('Cache-Control', 'public, max-age=3600');// 协商缓存:ETagconst data = { id: 1, name: 'Example' };const etag = require('crypto').createHash('md5').update(JSON.stringify(data)).digest('hex');res.set('ETag', etag);// 检查客户端If-None-Matchif (req.headers['if-none-match'] === etag) {return res.status(304).end(); // 返回304,使用缓存}res.json(data);
});
(2) Web服务器配置(如Nginx/Apache)
适用场景:静态资源(HTML/CSS/JS/图片)的缓存。
Nginx示例:
server {location /static/ {# 强缓存:1年(适用于版本化文件名如main.a1b2c3.js)add_header Cache-Control "public, max-age=31536000, immutable";# 协商缓存:Last-Modified/ETag(默认启用,无需额外配置)}location /api/ {# 动态接口禁用强缓存,只用协商缓存add_header Cache-Control "no-cache";# Nginx会自动处理ETag/Last-Modified(需确保后端未覆盖)}
}
(3) CDN控制(如Cloudflare/AWS CloudFront)
适用场景:全球加速的静态资源缓存。
Cloudflare规则示例:
• 缓存规则:匹配URL路径(如/images/*
),设置缓存有效期(如1小时)。
• 边缘缓存TTL:覆盖源站的Cache-Control
头。
2. 缓存策略选择与优先级
(1) 缓存配置的优先级
-
CDN设置 > Nginx配置 > 后端代码
• 如果CDN设置了缓存规则,它会覆盖Nginx或后端的Cache-Control
头。• 如果Nginx配置了
add_header
,它会覆盖后端代码的响应头。
(2) 如何决定使用哪种方式?
场景 | 推荐方式 | 理由 |
---|---|---|
静态资源(JS/CSS/图片) | Nginx/CDN | 高效、无需业务逻辑,直接通过文件名哈希(如main.a1b2c3.js )和强缓存优化。 |
动态API数据 | 后端代码 | 需要根据业务逻辑判断是否缓存(如用户隐私数据不可缓存)。 |
全局缓存策略 | CDN | 统一管理所有边缘节点的缓存行为,适合多地域部署。 |
(3) 强制禁用缓存的场景
• 需要实时数据的API(如股票价格):
Cache-Control: no-store
• 用户敏感信息(如个人资料):
Cache-Control: private, no-cache
3. 实战建议
(1) 静态资源优化
location /assets/ {# 文件名带哈希(如main.a1b2c3.js),强缓存1年add_header Cache-Control "public, max-age=31536000, immutable";
}
• 使用Webpack/Vite等工具生成哈希文件名,确保内容变化后URL改变。
(2) 动态API优化
// 后端代码(Express/Koa)
res.set({'Cache-Control': 'no-cache', // 禁用强缓存,但允许协商缓存'ETag': generateETag(data) // 基于内容生成ETag
});
(3) 调试缓存行为
• Chrome DevTools → Network → 查看请求头(Cache-Control
/ETag
)和响应状态(200
/304
)。
• cURL命令测试:
curl -I http://example.com/resource
# 检查响应头中的Cache-Control/ETag
总结
• 谁控制缓存?
• 静态资源 → Nginx/CDN
• 动态API → 后端代码
• 全局策略 → CDN
• 如何选择?
• 强缓存:Cache-Control: max-age=3600
(Nginx/CDN优先)。
• 协商缓存:ETag
/Last-Modified
(后端或Nginx自动处理)。
• 调试工具:Chrome DevTools、cURL、Web服务器日志。
合理配置缓存可显著提升性能,减少服务器压力! 🚀
相关文章:
强缓存与协商缓存的实现机制
文章目录 前言**1. 强缓存(强制缓存)****强缓存生效流程**:**2. 协商缓存(对比缓存)****协商缓存生效流程**:**对比总结****实际应用建议** **1. 缓存配置的三种主要实现方式** 前言 强缓存与协商缓存的实…...
【云备份】项目展示项目总结
目录 一. 项目展示 二. 项目总结 一. 项目展示 首先我们打开服务端,把没有用的东西都删干净,包括备份的文件信息啊什么的 这个时候我们启动服务器 我们先用浏览器去看看 什么东西都没有。 好,我们现在去启动客户端,下面这个是客…...
嵌入式 Linux Platform 驱动模型测试
文章目录 一、为什么要用 Platform 驱动模型? 二、Platform 驱动模型的三大核心组件 1.Platform 总线(虚拟总线) 2.Platform 设备(platform_device) 3.Platform 驱动(platform_driver) 三、Plat…...
Linux:web服务nginx
一.Nginx简介 Nginx (engine x) 是一个高性能的Web和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服器。Nginx处理高并发能力是十分强大的,能经受高负载的考验。而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行…...
【“星睿O6”评测】Armv9.2a、KLEIDIAI及vulkan加速llamacpp部署本地AI
llamacpp 简介 llama.cpp 的主要目标是通过最小的设置,实现 LLM 推理,在各种硬件上(无论是本地还是云端)提供最先进的性能。 纯 C/C实现,无任何依赖苹果 M1/M2 芯片(Apple silicon)优化&#…...
Advanced Installer 22.5打包windows 安装包
Advanced Installer 22.5打包windows 安装包 1、打开Advanced Installer 22.5打包工具,绿色免安装下载链接:https://download.csdn.net/download/LongtengGensSupreme/90778405 2、选择需要打包的文件 3、设置安装文件夹权限 4、安装参数设置 5、构建设…...
Qt界面设计时窗口中各控件布局及自适应方法
在进行Qt界面设计时,往往会因为控件的布局以及伴随窗口拉伸时控件没有做好自适应部署而导致界面效果大打折扣。 这里简单介绍一下QtDesigner实现界面自适应布局,包括水平布局、垂直布局、栅格布局应用,确保界面元素随窗口变化自动调整。 图1 如图所示,这是我们的设计目标…...
添加地形与自定义地形
在先前我们设置的地图中,放大后不难发现这是2d平面 此时我们可以使用cesium自带的方法对图层进行修改 terrainProvider:Cesium.createWorldTerrainAsync(_) 修改后重新打开地图明显有了3d效果 还可以自定义添加水纹效果 requestWaterMask: true, // 可选:请求水面掩…...
livedata使用,完整的livedata的Demo
完整 LiveData Demo(Java 实现) 下面是一个可直接运行的完整 LiveData 示例,包含 ViewModel、LiveData 的基本使用以及与 UI 的交互。 项目结构 app/ ├── java/ │ ├── com.example.livedatademo/ │ │ ├── MainActivity.java │ …...
SpringBoot+Vue全栈的一个简单入门案例
目录 开发环境 Github开源项目 入门一:跑起别人的开源项目 跑起前端Vue 跑起后端SpringBoot 运行效果 入门二:将HTML模板转成Vue组件 下载一个免费的HTML模板 通过Trae将HTML转成Vue组件 将生成Vue组件增加为Vue的一个路由节点 运行Vue看看效…...
Nginx 性能调优与深度监测全攻略
目录 Nginx 性能调优与深度监测全攻略 一、引言 二、Nginx 核心性能调优策略 2.1 基础参数优化 2.1.1 worker 进程配置 2.1.2 事件驱动模型优化 2.2 缓存与资源优化 2.2.1 静态资源缓存 2.2.2 反向代理缓存 2.3 网络与连接优化 2.3.1 TCP 参数调整 2.3.2 Keep-Aliv…...
bad interpreter: No such file or directory
shell脚本加sqlite插入语句,内容如下: #!/bin/bash # 数据库文件路径 DB_FILE"/opt/ecu/db/Test.db" # 检查数据库文件所在目录是否存在,若不存在则创建 DB_DIR$(dirname "$DB_FILE") if [ ! -d "$DB_FILE" ]…...
python安装pyqt5失败
记录 PyQt5不支持3.10及以上版本,pip install PyQt5时报错raise PyProjectOptionException(qmake 详细错误信息如下: $ pip install PyQt5 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting pyqt5Using cached https://pypi…...
【风控】模型监控和异常处理
在风控模型的全生命周期中,模型监控与异常处理是保障模型持续、稳定、可靠运行的关键环节。本指南旨在提供系统化、可落地的监控指标、预警策略及异常处置流程,帮助团队快速定位、响应并修复线上模型问题,最大限度降低风险。 1.模型监控与预…...
高并发内存池(一):项目简介+定长内存池的实现
目录 一,项目介绍 二,什么是内存池 1,池化技术 2,内存池 3,内存池主要解决的问题 4,malloc 三,实现一个定长内存池 定长内存池的设计 大致结构 核心功能实现 申请一块大小为T的内存 释…...
STM32--TIM--函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) 用于使能或禁用指定的定时器中断。...
文生图(Text-to-Image)的发展
文章目录 1. 早期探索(2010-2015):传统方法与初步尝试2. 文本条件GAN时代(2016-2019)3. 自回归与VQ-VAE时代(2019-2021)4. 扩散模型革命(2021-2022)(1) 扩散模型基础突破…...
vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开
文章目录 VS Code 预览模式如何取消预览模式(即“固定”标签页)?预览模式有什么用? VS Code 预览模式 在 VS Code 中,当你单击文件浏览器(例如,资源管理器侧边栏)中的某个文件时&am…...
热部署相关
手动热部署 启动热部署后代码进行修改可以不用重启整个项目Carl F9修改的代码就可以直接生效了 热部署只进行重启的操作而不用进行重载的操作 自动热部署 自定义重启排除项 关闭热部署 ture为开启热部署false为关闭 如果直接在application.yml里写可能会被其他优先级更高的配…...
高防ip是怎么做到分布式防御的
高防IP的分布式防御体系通过多维度技术协同实现攻击流量的分散处理与智能拦截,其核心机制可从以下五个层面解析: 一、全球节点网络布局 多区域节点覆盖 在全球关键互联网枢纽(如北美、欧洲、亚太)部署清洗中心&am…...
结构可视化:利用数据编辑器剖析数据内在架构
结构可视化聚焦于展示数据的内部结构和各部分之间的关系,使企业能够深入理解数据的组织方式和层次体系,从而更好地进行数据管理和分析。通过结构可视化,企业可以清晰地看到数据的层次结构、关联关系以及数据流动路径,为数据驱动的…...
QT编程练习20250507
#include <stdio.h> // 包含标准输入输出库 #include <stdlib.h> // 包含通用工具库(如malloc, free等) #include <string> // 包含C string类定义 #include <iostream> // 包含C输入输出流库using namespace std; // 使用st…...
【软件设计师:算法】3.排序算法
一、排序 将一组杂乱无章的数据按一定的规律次序排列起来。 排序的目的是什么? 便于查找!排序算法的好坏如何衡量? 时间效率——排序速度(即排序所花费的全部比较次数)空间效率——占内存辅助空间的大小稳定性——若两个记录A和B的关键字值相等,但排序后A、B的先后次序保…...
Linux 内核学习(7) --- 字符设备驱动
字符设备驱动程序 Linux 中主要有三类设备的驱动程序,分别是字符设备驱动程序,块设备驱动程序和网络设备驱动程序 字符设备是指在 I/O 传输过程中以字符为单位进行传输的设备,例如键盘,打印机等,字符设备的驱动程序结…...
vue3+vite项目引入tailwindcss
从2025年1月tailwindcss4.0发布开始使用tailwindcss比之前简化很多 1,安装 yarn add tailwindcss tailwindcss/vite2,配置vite.config.js import tailwindcss from tailwindcss/vite;...plugins: [tailwindcss(),...] ...3,在主css文件顶部添加 注意一定是css文件,不能是sc…...
IIS配置SSL
打开iis 如果搜不到iis,要先开 再搜就打得开了 cmd中找到本机ip 用http访问本机ip 把原本的http绑定删了 再用http访问本机ip就不行了 只能用https访问了...
LeetCode:对称二叉树
1、题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示: 树中…...
6天从0到精通:MySQL基础快速入门指南
放在前头 6天从0到精通:MySQL基础快速入门指南 6天从0到精通:MySQL基础快速入门指南 在数据驱动的时代浪潮下,MySQL作为全球最受欢迎的开源关系型数据库管理系统之一,广泛应用于Web开发、数据分析、云计算等多个领域。无论是刚…...
信息论12:从信息增益到信息增益比——决策树中的惩罚机制与应用
从信息增益到信息增益比:决策树中的惩罚机制与应用 引言:当"信息量"遇到"公平性" 在2018年某银行的信用卡风控系统中,数据分析师发现一个诡异现象:客户ID号在决策树模型中竟成为最重要的特征。这个案例揭示…...
C++ -- 哈希扩展
目录 位图 位图概念 位图的实现 位图应用 布隆过滤器 布隆过滤器的提出 布隆过滤器概念 布隆过滤器的插入 布隆过滤器的查找 布隆过滤器的删除 位图 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数…...
AI大模型分类以及Prompt优化技巧
目录 一、AI大模型分类 1、按模态分类 2、按开源性分类 3、按规模分类 4、按用途分类 如何对比和选择大模型 二、Token 如何计算 Token 如何估算Token成本 三、Prompt工程 Prompt优化技巧 基础提示技巧 1、明确指定任何和角色 2、提供详细说明和具体示例 3、使用…...
将本地项目提交到新建的git仓库
方式一: # 登录git,新建git仓库和指定的分支,如master、dev# 下载代码,默认下载master分支 git clone http://10.*.*.67/performance_library/pfme-*.git # 切换到想要提交代码的dev分支 git checkout dev# 添加想要提交的文件 git add .#…...
【wpf】10 C#树形控件高效实现:递归构建与路径查找优化详解
在WPF应用程序开发中,树形控件的实现是常见且具有挑战性的需求。本文将深入解析一套高效树形结构的实现方案,包含递归构建、路径查找优化、动态交互等多个关键技术点。 一、递归构建树形结构 private TreeItem CreateTreeViewItem(TreeNode node) {var…...
低空科技护航珞樱春色,技术引领助推广阔应用
春风拂珞珈,樱海绽放时。赏樱季已接近尾声,作为武汉大学测绘遥感信息工程全国重点实验室的成果转化科技型企业,大势智慧积极参与校园的智能化建设,助力武汉大学的樱花季巡航管理,打造更为安全、有序的赏樱体验。 低空…...
Tiny Machine Learning在人类行为分析中的全面综述
论文标题: 中文:《Tiny Machine Learning在人类行为分析中的全面综述》 英文:A Comprehensive Survey on Tiny Machine Learning for Human Behavior Analysis 作者信息: Ismail Lamaakal, Student Member, IEEE, Siham Essahr…...
8.12 GitHub Sentinel企业级进化:容器化优化×AI监控,效率提升300%实战
GitHub Sentinel 扩展优化与商业化演进路径 关键词:企业级 Agent 扩展性设计、容器化部署优化、多格式报告生成、第三方服务集成、SaaS 服务架构 1. 功能扩展方向 1.1 多格式报告生成技术实现 采用模板引擎与文件流处理技术实现动态报告生成: #mermaid-svg-2BhQlvVsDp5NdL…...
算法-时间复杂度和空间复杂度
刷算法必备时间和空间复杂度,记录下方便查询。 时间复杂度 概念 时间复杂度衡量的是算法 执行所需的时间 随输入规模 n 增长的变化趋势,用大O 表示法描述(通常是看这个循环)。 分类 常数时间O(1) 无论输入多大,执行…...
springboot国家化多语言实现
前言 公司在做国际化项目时需要匹配多语言环境,通过spring实现i18n国际化方便快捷 项目结构 src/ ├── main/ │ ├── java/ │ │ └── com/example/i18ndemo/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # …...
第2章 算法分析基础
2-1 算法的时间复杂度分析 2.1.1 输入规模与基本语句 输入规模:算法处理数据的规模,通常用 n 表示。 基本语句:执行次数与输入规模直接相关的关键操作。 例2.1 顺序查找 int SeqSearch(int A[], int n, int k) { for (int i 0; i < n…...
vue2 计算属性 computed
计算属性他是一个属性,他不是一个函数,使用的时候不要加括号 reduce reduce 是 JavaScript 数组的一个高阶函数,用于对数组中的每个元素执行一个累积计算,最终返回一个单一的值。...
Milvus 向量数据库详解与实践指南
一、Milvus 核心介绍 1. 什么是 Milvus? Milvus 是一款开源、高性能、可扩展的向量数据库,专门为海量向量数据的存储、索引和检索而设计。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP&am…...
记录一次 python 文件环境变量配置-sqlmap.py
第一步:环境变量配置 C:\Users\14913\Downloads\application\3.secure\sqlmap-2025.5.6 或者 C:\Users\14913\Downloads\application\3.secure\sqlmap-2025.5.6 都可以! 第二步 使用 第一步:不再进目录 第二步:不再python … s…...
使用大语言模型进行机器人规划(Robot planning with LLMs)
李升伟 编译 长期规划在机器人学领域可以从经典控制方法与大型语言模型在现实世界知识能力的结合中获益。 在20世纪80年代,机器人学和人工智能(AI)领域的专家提出了莫雷奇悖论,观察到人类看似简单的涉及移动和感知的任务&#x…...
STM32 CAN总线
目录 定时传输CAN简介和硬件电路 CAN简介 主流通信协议对比 编辑 CAN硬件电路 编辑 CAN电平标准 CAN收发器 – TJA1050(高速CAN) CAN物理层特性 帧格式 数据帧 遥控帧 错误帧 过载帧 编辑 帧间隔 编辑 位填充 波形实例 位…...
使用JMeter 编写的测试计划的多个线程组如何生成独立的线程组报告
我有一个测试计划,里面有两个线程组,如下: 添加了一个HTTP请求默认值: 然后我使用如下命令生成的可视化报告是两个线程组合并后的聚合报告。 jmeter -n -t 百度测试计划.jmx -l baidu.txt -e -o ./baidu但是我想要的效果是每…...
RabbitMQ如何保证消息不丢失?
在RabbitMQ中,消息丢失可能发生在三个阶段:生产者发送消息时、消息在RabbitMQ服务器内部传递时、消费者接收消息时。为了保证消息不丢失,需要从这三个方面分别采取措施: 1. 生产者确保消息发送成功 开启确认模式(Conf…...
RAG 的介绍及评价方法
RAG的作用 大模型虽然具备处理复杂语言任务的强大能力,但在知识更新和依赖外部信息的及时性方面存在局限。大模型在训练时捕获的知识通常是静态的,一旦训练完成,模型便不再更新,无法掌握训练数据集之外的最新信息或事件。RAG可以…...
Linux网络新手注意事项与配置指南
Linux系统在网络管理方面提供了丰富的工具和灵活的配置方式,但对于新手来说,掌握正确的操作方法和注意事项至关重要。本文将从网络基础概念、配置工具、安全设置、故障排查以及常见错误等多个方面,结合具体代码示例,详细讲解Linux网络管理的核心内容,帮助新手快速入门并避…...
CI/CD与DevOps流程流程简述(提供思路)
一 CI/CD流程详解:代码集成、测试与发布部署 引言 在软件开发的世界里,CI/CD(持续集成/持续交付)就像是一套精密的流水线,确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师,接下来…...
【AWS+Wordpress-准备阶段】AWS注册+创建EC2实例
前言 自学笔记,解决问题为主,亲测有效,欢迎补充。 本地WP文件部署到AWS整体步骤如下:(本文重点:AWS准备完成) 0. [AWS 准备] 注册 AWS 并创建 EC2 实例 ↓ 1. [生成安装包:用 Du…...