HTTP/1.1 Cache中Expiration机制

深入理解 ASP.NET Cache 运行机制与实战避坑指南 ASP.NET Cache 是 .NET Framework 时代基于 System.Web.Caching.Cache 的服务器内存缓存组件,虽被 ASP.NET Core 的 IMemoryCache 取代,但其自动过期、依赖联动、优先级淘汰和回调通知等核心设计思想仍深刻影响现代缓存架构。它并非简单字典,而是具备完整生命周期管理的可控缓存系统,适用于金融、政务等强一致性要求的存量系统优化。理解其与 AppDomain 绑定、内存压力感知、CacheExpiresThread 工作机制及 SqlCache 阅读详情

Cache是一种常见的提高系统的运行效率的方法。在HTTP/1.1中,通过Cache的Expiration机制,让尽可能减少由Client向Server发送请求的次数。这篇博客简单介绍HTTP Header中与Expiration相关的字段。


1. Expires

Expires早就存在于HTTP/1.0,是由服务器指定的Response过期时间。表明在Expires这个时间点之前,返回的response都是足够新的或者说是有效的,Client无需再向Server发送请求。Expires表示的是一个绝对的时刻,所以,每次返回的Expires的时间极有可能都不一样。


下面就用一个例子作为演示:

我首先自己写了一个简单的Servlet,这个Servlet在HTTP response头部中塞入了Expires信息。

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        long now = System.currentTimeMillis();
        resp.setDateHeader("Expires", now + 3600000);
        ...
    }


当Server启动以后,我们用Firefox作为工具检测我们的请求发送情况以及收到的包头信息。

当我通过Firefox第一次打开 http://localhost:8080/httpdemo 时,服务器返回的头部包括了

Expires: "Mon, 31 Mar 2014 18:31:35 GMT"

Expires值表明,在"Mon, 31 Mar 2014 18:31:35 GMT"这个时间之前,这个返回值都是有效的。Client无需再去从Server取信息。如下图所示:


需要注意的是,这里的Expires指示告诉Client如果这个response没有过期,没有必要再次访问。但这并不意味着response过期之前,Client不能向Server发送请求。同时,Expires也不意味在response过期以后,Client需要主动的去Server取最新的消息。


2. Cache-control: max-age

在HTTP/1.1这个标准中引入了一个新的字段Cache-control。Cache-control中有一条指令,叫max-age。

Age表示这个Response已经存活了多久了。而max-age表示response最大的存活时间。所以,max-age表明了这条被cache的消息在多长时间段内是有效的。


下面就简单的用一个例子来做演示:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.addHeader("Cache-Control", "max-age=3600");
...
    }

我们访问 http://localhost:8080/httpdemo/ 以后,服务器返回的response中包含了

Cache-Control: "max-age=3600"

表示这个response生成以后一个小时之内都不会过期,也就不需要再向服务器发送请求了。


如果返回的消息中,同时出现了Cache-control: max-age和Expires,那么以Cache-control: max-age为准,Expires的声明将会被覆盖掉。



3. 更多

可能有比较调皮的同学,用Chrome试了前面的Expires例子,发现Chrome再次向服务器发送了请求。这是为什么呢?我们先看看截取到的request:


我们发现Request中的max-age是0,那么当max-age出现在request中的时候,服务器又会做些什么呢?


Cache中的Expiration机制还有非常多可以讲的东西,但是最最基本的东西就前面的这么一点儿,想要更多的了解Cache中的age计算,可以参考下面提供的链接,都是非常好的详尽参考资料。


参考资料:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11

http://www.bitsandpix.com/entry/java-servlet-set-expires-header-with-cache-control/




HTTP缓存全链路解析:从浏览器到CDN的五层决策机制 HTTP缓存是Web性能优化的核心基础设施,其本质是一套基于RFC 7234规范的分布式状态协调机制,涵盖新鲜度验证、再验证流程、缓存键计算与多级协同策略。理解Cache-Control指令语义(如no-cache不等于禁用缓存)、ETag强弱校验差异、Vary头对缓存键的影响,是保障内容一致性与用户体验的关键。该机制广泛应用于电商页面加速、CDN边缘缓存治理、前端静态资源长期缓存(immutable+hash)及Serverless场景下的响应复用。本文聚焦真实生产环境中的五层缓存拦截链路——浏览器、代理 阅读详情

相关推荐

HTTP(持续连接,无状态)

HTTP协议是超文本传输协议,定义了浏览器与服务器之间请求和传输文档的方式。它基于TCP/IP等底层协议,通过URL/URI定位资源,支持GET、POST等方法实现客户端与服务器交互。HTTP报文由起始行、头部字段和消息正文组成,具有简单快速、灵活、无连接无状态的特点。HTTPS在HTTP基础上增加了SSL加密层保证安全性。完整的HTTP请求过程包括DNS解析、TCP连接建立、请求发送、响应接收等步骤。Web服务器作为应答方,处理请求并返回相应资源。

Hongwei_1990的博客 912

redis缓存简单使用

一般情况下,redis用在项目中的缓存,或者在项目中使用redis分布式锁(针对服务器集群) 做缓存时,一般用于大量需要查询的数据,把数据存放到缓存中,避免数据库的压力过大。我曾经的写法是 1.先从redis里根据key查询value 2.指定的key对应的value不存在然后去数据库里查询 3.查出来了之后再把数据以同样的key+value+过期时间存到redis里 4.直接根据从数据库里获取的数据进行操作拿到自己想要的数据,然后直接返回 偶然在项目中看到的写法是, 1.先从redis里根据

dsl 1114

LTE信令流程实战:从Attach到Service Request的完整解析(附常见问题排查)

本文深入解析LTE信令流程中的Attach和Service Request关键环节,提供从基础原理到实战排查的完整指南。涵盖鉴权、承载建立等核心步骤,分析常见故障模式及优化方案,并附赠信令跟踪工具使用技巧,助力通信工程师提升网络运维效率。

alpha的博客 319

SpirngCache、Redis指定过期时间、到期自动刷新

缓存作为提升应用性能的重要手段,其管理策略的合理性直接影响到应用的响应速度和数据一致性。在Spring框架中,Spring Cache提供了一种声明式缓存的解决方案,而Redis作为高性能的缓存数据库,被广泛应用于缓存实现。本文将介绍一种通过自定义注解实现Spring Cache与Redis缓存过期时间管理及自动刷新的策略。

优快云_Ty的博客 3766

GhidrAssist:AI驱动的逆向工程助手实战指南

逆向工程是分析软件内部工作原理、理解二进制代码逻辑的关键技术,广泛应用于软件安全、恶意代码分析和漏洞挖掘等领域。其核心原理在于通过反编译、控制流与数据流分析等手段,将机器码还原为可理解的高级语言表示。传统逆向分析高度依赖人工经验,面对海量代码时效率低下且易出错。随着大语言模型(LLM)技术的发展,其强大的代码理解与推理能力为自动化逆向分析提供了新的可能。通过将LLM与成熟的逆向工程框架(如Ghidra)相结合,可以构建智能辅助系统,实现代码意图的自动解释、变量/函数的智能重命名以及潜在漏洞模式的辅助识别,从

weixin_42547335的博客 596

从充电管理芯片里‘偷师’:拆解一个PMOS双向开关电路,搞定你的固态继电器需求

本文深入解析了PMOS双向开关电路在固态继电器应用中的设计要点,重点探讨了防电流倒灌和高侧双向开关的实现技巧。通过拆解充电管理芯片中的PMOS背靠背结构,工程师可以构建高效可靠的固态开关方案,适用于智能硬件和电池管理系统。文章还提供了关键参数选择、电路优化建议及实测数据对比,助力解决电源防反接等工程难题。

weixin_33698043的博客 481

从零手写 cache 之 redis expire 过期实现原理

前言 我们在 从零手写 cache 框架(一)实现固定大小的缓存 中已经初步实现了我们的 cache。 本节,让我们来一起学习一下如何实现类似 redis 中的 expire 过期功能。 过期是一个非常有用的特性,比如我希望登录信息放到 redis 中,30min 之后失效;或者单日的累计信息放在 redis 中,在每天的凌晨自动清空。 代码实现 接口 我们首先来定义一下接口。 主要有两个:一个是多久之后过期,一个是在什么时候过期。 public interface ICache<K, V>

1956

《Ventoy 制作系统安装 U 盘的具体步骤》

然后您可以在电脑的磁盘管理中对 U 盘进行快速格式化,选择 FAT32 或 NTFS 文件系统。至此,Ventoy 系统安装 U 盘就制作完成了。您可以在需要安装系统的电脑上,从 U 盘启动,然后选择相应的系统镜像进行安装。安装完成后,将您需要的操作系统镜像文件(如 Windows、Linux 等的 ISO 格式镜像)复制到 U 盘的根目录。在安装程序中,选择您插入的 U 盘设备,确保选择正确,以免误操作。2. 确认选择的 U 盘盘符正确,防止误操作导致其他磁盘数据丢失。点击“安装”按钮,等待安装完成。

jiyiwangluokeji的博客 2665

Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存

时间方式,直接扩展注解的Value值,如: @Override @Cacheable(value = "people#${select.cache.timeout:1800}#${select.cache.refresh:600}", key = "#person.id", sync = true) public Person findOne(Person person, String a, String[] b, List<Long> c) { Person p = personR

baidu_37366055的博客 5413

图像处理:张量分解在图像处理领域的应用

随着计算机视觉和图像处理技术的快速发展,图像数据呈现出高维、多模态、海量等特点。传统的矩阵分解方法已经无法有效处理这些复杂的图像数据。张量分解作为一种高阶矩阵分解方法,可以很好地捕捉图像数据的高维结构信息,在图像处理领域展现出巨大的应用前景。本节介绍几种常用的张量分解算法,包括高阶SVD(HOSVD)、Tucker-ALS、CP-ALS等。这些算法的核心思想是通过迭代优化的方式,交替更新张量分解的因子矩阵,直到收敛为止。综上所述,本文系统地介绍了张量分解技术在图像处理领域的应用。

AI天才研究院 7102

Python爬虫实战:Boss直聘职位数据采集实战 - Playwright + 结构化解析完整方案(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 2185

前端性能优化-开启 HTTP 缓存

点击上方程序员成长指北,关注公众号 回复1,加入高级Node交流群哈喽,大家好,我是考拉????。接上一篇整体有哪些优化手段,如何回答出让面试官满意的前端性能优化?如何回答面试官,后面会对每个手段进行详细介绍讲解开启HTTP缓存是前端性能优化中提高资源加载效率的重要手段。以下是几个关键点:减少重复请求:通过缓存机制,浏览器可以存储已请求过的资源,减少对服务器的重复请求。设置缓存头:在服务器端设置合适...

程序员成长指北 338

AI Agent 入门(一):什么是 AI Agent?——从概念到第一个 API 调用

AI Agent 入门(一):什么是 AI Agent?——从概念到第一个 API 调用

nbtang的博客 257

Guava Cache Deep Dive

Guava Cache 是 Google Guava 提供的本地缓存实现,基于 JDK7 的 ConcurrentHashMap 分段锁设计。它支持自动加载、容量控制、过期策略和基于引用的回收机制,但已停止更新,Google 推荐使用 Caffeine 替代。 核心架构采用三层设计:LoadingCache → LocalCache → Segment[],每个 Segment 包含哈希表、写入队列、访问队列和最近使用队列。 主要功能: CacheLoader 机制实现自动加载,避免缓存穿透 提供 get(

quwenqian的专栏 436

学Simulink——十二脉波整流电路(移相变压器)谐波抵消仿真

Y:Δ = 1:√3(若 DC 同压)— 此处同相电压故 220V(Y)=220V(Δ phase)Y(相电压=220V)、Δ(线电压=380V ⇒ 相=220V,30° 移相)可经 Lbal​=0.5mH(平衡电抗)或直接短(大 L_dc 下均流尚可)✅ 直流输出纹波频率 = 12·f_line(vs 6·f_line)直流输出 → Ldc​=50mH→Cdc​=2200µF→R=30Ω。Line‑Line RMS = 380 V(⇒ 相=220V)Vdc​≈1.35⋅380≈513V(同 6‑脉波)

xiaoheshang_123的博客 58

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Twig cache 标签实战指南:使用 twig/cache-extra 缓存模板片段

本文以 Twig 官方文档 [doc/tags/cache.rst](https://link.gitcode.com/i/ab61a380c60a996aa8c69fe36787d58c) 为骨架,系统讲解 `{% cache %}` 标签的完整用法:如何缓存模板片段、如何用 `ttl()` 设置过期时间、如何用 `tags()` 为缓存打标签,以及命名缓存键的最佳实践。同时结合仓库内 `twi

gitblog_00005的博客 291

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RabbitMQ 访问控制缓存插件(rabbitmq_auth_backend_cache)配置与实现原理完全指南

`rabbitmq_auth_backend_cache` 是 RabbitMQ 官方随主发行包提供的认证/授权(authn/authz)缓存插件。它本身不是一个独立的认证后端,而是架设在 LDAP、HTTP 等"上游"后端之上的一层缓存代理,用于在可配置的时间窗口内缓存认证与鉴权结果,显著降低上游后端(尤其是需要网络请求的 LDAP、HTTP 后端)的负载。阅读本文后,你将掌握该插件的启用方式、

gitblog_01101的博客 957

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

react-admin 缓存机制完全指南:乐观渲染、HTTP 缓存与应用级缓存

React-admin 是一套基于 REST/GraphQL API 的前端框架(使用 TypeScript、React 与 Material Design 构建),其缓存策略直接决定了管理后台的渲染速度与网络开销。本文基于当前仓库的官方文档([Caching.md](https://link.gitcode.com/i/87b7a704d6bc6ec6a28f864cb80a43a1))并结合

gitblog_00038的博客 748

Yii 2 缓存机制全解析:从数据缓存到 HTTP 缓存的四层实战指南

缓存是提升 Web 应用性能最经济、最有效的手段之一。Yii 2 框架内置了完整的缓存体系,覆盖服务端的数据缓存、片段缓存、页面缓存,以及客户端的 HTTP 缓存四个层次。本文以 Yii 2 官方缓存指南([caching-overview](https://link.gitcode.com/i/6ace978bde1d6e2ace53f227e8081735) 及对应的 [数据缓存](https

gitblog_06871的博客 186

vectorbt 向量化回测指南:如何快速回测策略、批量扫参数并分析绩效

如果你在找一款能"把上千组交易参数一次跑完"的 Python 回测引擎,vectorbt 值得先看一眼。它的思路很直白:不是一根 K 线一根 K 线地循环,而是把成百上千种策略配置打包进 NumPy 数组里一起算,于是别人要跑一小时的网格搜索,这里可能几十秒就出结果。这篇指南带你从零装好它、跑通第一个策略,再一步步学会扫参数、画图表这些真正用得上的操作。 ## 它是什么,又适合谁来用 vect

gitblog_00357的博客 250

KubeSphere 仓库中的 cachecontrol:基于 RFC 7234 的 HTTP 缓存判定库源码解析与实战

本文围绕 KubeSphere 仓库中 vendored 的 `github.com/pquerna/cachecontrol`(v0.1.0,见 [go.mod](https://link.gitcode.com/i/e5f7c130f7474dfefc21e2c4e8b1f372))展开,系统讲解这个 HTTP 缓存“控制面”库的定位、高层与底层两套 API、`Cache-Control` 指

gitblog_00036的博客 425

Cat-Catch 指南:媒体嗅探、视频下载与 M3U8 合并完整清单

猫抓(cat-catch)是一款开源的浏览器媒体嗅探扩展:它监听页面发出的网络请求,把其中的视频、音频、M3U8 流(一种播放列表文件,内部指向成百上千个小视频分片)筛选出来列成清单。每一项都可以直接预览、复制或下载,也能转交给外部工具处理。所有数据只在本地存储,不会发送到远程服务器。下面按真实使用场景逐个讲。 ## 🧩 安装 Cat-Catch:应用商店、crx、源码三种方式 长期使用最省

gitblog_00859的博客 437

彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法 作者和出处“腾讯Bugly(http://bugly.qq.com)” 原创:李志刚腾讯Bugly2016-12-15 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依...

wangpeng322的博客 243

Codex-X 海鸥3.0破甲内置指令:从激活词到 AGENTS.md 注入的完整启用指南

Codex-X 是 OpenAI Codex 桌面端与 CLI 的可视化管理工具,「海鸥3.0破甲」是它离线内置的五套中文 Agent 指令模板之一,源码在 [examples/海鸥3.0破甲.md](https://link.gitcode.com/i/e788b5355de969db429feec6b0cf927d),启用后以受管区块写入 Codex 的 `AGENTS.md` 生效。本文拆解

gitblog_00193的博客 393

免越狱给 iPhone 装 App:iloader 完整侧载流程与排错指南

iloader 是一款免费、跨平台的 iOS 侧载工具:不用越狱,就能把 SideStore、LiveContainer 或你自己的 .ipa 签名装进 iPhone / iPad,签名证书、配对文件、App ID 这些麻烦事都由它自动处理。本文按「点安装按钮之前 → 按钮之后的完整操作 → 装完之后的事」三步带你把 App 装上去,最后再收一遍最常见的故障排查。 ## 点按钮之前:驱动、渠道和

gitblog_00615的博客 749
上一篇: 《麦肯锡方法》读书笔记
下一篇: Java中的String、StringBuilder、StringBuffrer
kiwi小白
博客等级 码龄14年 153粉丝 154原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值