HTTP缓存看这一篇就够了

news2025/7/16 7:16:36

前言

HTTP缓存机制是优化web性能的重要手段,也是优化用户体验的重要一环。了解和熟悉HTTP缓存机制也成为了前端工作者必不可少的技能。

HTTP缓存是用于临时存储网页资源(如HTML页面、图像等),以减少服务器延迟的一种技术。HTTP缓存系统会保存下通过这套系统的文档的副本;如果满足某些条件,则可以由缓存满足后续请求。HTTP缓存系统既可以指设备,也可以指计算机程序。

一、HTTP缓存的类别

HTTP缓存可分为强制缓存和协商缓存。

**强制缓存:**直接使用客户端缓存,不从服务器拉取新资源,也不验证缓存资源是否过期。返回的状态码为200(OK)。

**协商缓存:**通过服务器验证资源有效性,资源有效则返回304(Not Modified),资源失效则返回最新的资源文件。

HTTP主流的有三个版本:HTTP/1.0、HTTP/1.1、HTTP/2.0。其中HTTP/1.0和HTTP/1.1的应用最为广泛。HTTP/2.0因对缓存机制的改动有别于HTTP/1.0和HTTP/1.1,因此HTTP/2.0相关内容会在文末总结部分进行介绍。HTTP/1.0与HTTP/1.1可根据缓存类别区分如下:

HTTP版本强制缓存协商缓存
HTTP/1.0ExpiresLast-Modified
HTTP/1.1Cache-ControlETag

二、主流的HTTP缓存参数

2.1 强制缓存

2.1.1 HTTP/1.0 - Expires

Expires的值为服务端返回的到期时间,是一个GMT(格林尼治标准时间)绝对时间,如:Tue, 17 Jan 2023 03:48:45 GMT。下一次请求时,客户端判断当前系统GMT时间是否小于缓存携带的GMT时间。若小于,直接使用缓存数据,否则从服务器请求新的文件。

不过Expires存在的问题也显而易见。

首先,使用客户端获取的GMT时间与服务器GMT时间作比较,如果客户端主动修改了系统时间,就会出现缓存命中的误差。

其次,GMT时间是基于格林尼治天文台测算时间后,每隔一小时想全世界发放调时信息。观测本身存在的误差以及非实时的同步机制,都可能会导致出现缓存命中的误差。

所以在HTTP/1.1版本中,使用Cache-Control中的max-age替代。

2.1.2 HTTP/1.1 - Cache-Control

Cache-Control 是HTTP/1.1中重要的缓存规则。它可以在HTTP请求头和响应头中使用,提供了多样化的配置参数。同时也可以适用于更广泛的复杂场景。

指令格式具有以下有效规则:

  • 不区分大小写,但建议使用小写。
  • 多个指令以逗号分隔。
  • 具有可选参数,可以用令牌或者带引号的字符串语法。

常用的指令如下:

  • no-store:不使用任何形式的缓存。具有HTTP缓存的最高优先级。
  • no-cache:不使用强制缓存。每次进行响应前都向服务器进行缓存有效性验证。
  • public:公共缓存。任何从源服务器到客户端中的每个节点都可以对资源进行缓存。
  • private:私有缓存。仅客户端可以对资源进行缓存。
  • max-age:客户端缓存存储的最长时间,单位秒。判断的优先级高于Expires,客户端会判断资源已缓存的时长是否小于设置的max-age时长。是则直接使用缓存数据,否则会进行Expires的判断流程。
  • s-maxage:代理缓存服务器最长的缓存时间,单位秒。优先级高于max-ageExpires,仅适用于缓存服务器。

2.2 协商缓存

客户端缓存失效后会向服务器进行进行缓存有效性验证,这个缓存有效性验证的过程就是协商缓存。若资源有效,则返回304(Not Modified)。客户端拿到304状态码后会再从本地缓存中获取资源。整个请求响应过程是与无缓存流程一样的。相对于无缓存流程的优势在于仅响应状态码后,客户端直接从本地缓存获取文件,而无需进行文件下载。减少了网络响应的文件大小,进而加快了网络响应速度。

协商缓存的请求和响应是需要相互配合的,可组合使用。如下表:

版本\阶段请求响应
HTTP/1.0If-Modified-Since/If-Unmodified-SinceLast-Modified
HTTP/1.1If-None-match/If-MatchE/Tag

协商缓存会先判断请求头中是否携带no-store。如果携带,则直接返回最新的服务器文件。

2.2.1 HTTP/1.0 - Last-Modified

客户端第一次向服务器请求资源时,服务器会返回资源。同时会在响应头中添加Last-Modified字段来表明资源的最后修改时间。当客户端强制缓存失效后,会重新向服务器进行缓存有效性验证。在验证的请求头中,会添加If-Modified-Since字段。服务器会对请求头中的If-Modified-Since和其存储的资源Last-Modified进行比较。若If-Modified-Since的时间不小于Last-Modified,则资源有效,返回304(Not Modified)。否则返回资源本身,并且重新记录文件的Last-Modified

Last-Modified:响应头携带的资源最后修改时间。格式为last-modified:GMT

如:last-modified: Sat, 14 Jan 2023 08:40:00 GMT

If-Modified-Since:请求头携带的资源是否在某个时间后有修改。服务器会使用此值和其本身存储的时间进行比较。格式为:If-Modified-Since:GMT。只可以用在 GETHEAD请求中。

If-Unmodified-Since:请求头携带的资源是否在某个时间后没有修改。格式为:if-unmodified-since:GMT 。有别于If-Modified-SinceIf-Unmodified-Since被用于POST或其他非简单请求。如果在If-Unmodified-Since指定的时间内有过修改,则返回412(Precondition Failed)

Last-Modified也是存在严重问题的。

首先,Last-Modified只关注文件的最后修改时间,和文件内容无关。所以文件内容在修改后又重新恢复,也会导致文件的最后修改时间改变。此时客户端的请求则无法使用缓存。

其次,Last-Modified只能监听到秒级别的文件修改,如果文件在1秒内进行了多次修改,那么响应头返回的Last-Modified的时间是不变的。 此时客户端因接收到响应304,会导致资源无法及时更新,使用缓存的资源文件。

因此HTTP/1.1使用了ETag来进行缓存协商。

2.2.1 HTTP/1.1 - ETag

为了解决上述Last-Modified可能存在的不准确的问题,HTTP/1.1推出了新的响应字段ETag来进行协商缓存。ETag的优先级比Last-Modified高。

服务器接收到浏览器请求后,会先进行If-None-MatchETag值的比较。若相等,则资源有效,返回304(Not Modified)。否则返回资源本身,并且重新记录文件的ETag

ETag:响应头携带的资源标识符。格式为ETag:ETag-value可由服务器自行设置算法生成,通常是使用内容的散列或简单的使用版本号。

如:etag: "I82YRPyDtSi45r0Ps/eo8GbnDfg="

If-None-Match:请求头携带的是否无匹配文件字段。优先级高于Last-Modified。当服务器没有任何资源的ETag与请求头携带的ETag值完全一样时,返回最新的资源,否则服务器会返回304。

如: if-none-match:"I82YRPyDtSi45r0Ps/eo8GbnDfg="

If-Match:请求头携带的是否存在匹配文件字段。对于简单请求需要搭配 Range首部使用。对于非简单请求,如PUT,可用于上传ETag

如: if-match:"I82YRPyDtSi45r0Ps/eo8GbnDfg="

三、总结

通过前文,我们了解到 HTTP 缓存主要分:强制缓存、协商缓存。
强制缓存由Exipres(HTTP/1.0)、 Cache-Control(HTTP/1.1)控制。客户端直接读本地缓存,不会再跟服务器端交互,状态码 200。

协商缓存由 Last-Modified / If-Modified-Since(HTTP/1.0), Etag /If-None-Match(HTTP/1.1)进行有效性验证,每次请求需要让服务器判断一下资源是否更新过,从而决定客户端是否使用缓存,如果是,则返回 304,否则返回最新文件。

HTTP/2.0中设计了新的缓存方式,服务器推送(Push Server)。有别于强制缓存和协商缓存,属于推送缓存。这种新的缓存方式主要是为了解决客户端缓存时效性的问题,即还没有收到客户端的请求,服务器就把各种资源推送给客户端。比如,客户端只请求了a.html,但是服务器把a.html、a.css、a.png全部发送给客户端。这样的话,只需要一次请求,客户端就更新了所有文件的缓存,提高了缓存的时效性。

参考:

GMT(维基百科):https://en.wikipedia.org/wiki/Greenwich_Mean_Time

HTTP缓存(MDN):https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching

转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nim语言在不同操作系统安装

官网: Nim Programming Language 学习文档: Nim文档概述 Tutorial (part I)The Nim one deals with basics. 官方下载地址:Download - Nim Programming Language 目录 Mac OS Ubuntu centos Mac OS 安装语言 brew install nim 安装…

nodejs基于vue的饭店点餐外卖平台网站

本系统主要实现了管理员:首页、个人中心、用户管理、菜品分类管理、菜品信息管理、菜品评价管理、系统管理、订单管理,用户:首页、个人中心、菜品评价管理、我的收藏管理、订单管理,前台首页:首页、菜品信息、菜品资讯、个人中心、后台管理、…

尚医通(九)数据字典模块前后端 | EasyExcel

目录一、数据字典介绍1、什么是数据字典2、页面展示效果3、数据字典表设计4、数据分析5、根据页面效果分析数据接口二、搭建数据字典模块三、数据字典列表接口1、model模块添加数据字典实体2、添加数据字典mapper3、添加数据字典service4、添加数据字典controller四、数据字典列…

【百宝书】ChatGPT真的会成为MOSS吗?如果MOSS真的存在,地球和人类的结局会是怎么样的。

大家好,我是涵子,今天我们紧随潮流,聊聊ChatGPT会成为MOSS吗?如果MOSS真的存在,地球和人类的结局会是怎么样的。 本次借鉴内容: 程序yang - ChatGPT的火爆出圈,你对它有几分了解?_程…

【C++提高编程】map/ multimap 容器详解(附测试用例与结果图)

目录1. map/ multimap容器1.1 map基本概念1.2 map构造和赋值1.3 map大小和交换1.4 map插入和删除1.5 map查找和统计1.6 map容器排序1.7 案例-员工分组1.7.1 案例描述1.7.2 实现步骤1. map/ multimap容器 1.1 map基本概念 简介: map中所有元素都是pairpair中第一个…

“亚洲一号”也能上市?REITs背后的物流设施风起云涌

京东最近发生了两件大事,两件都与物流基础设施有关。 一件是2月8日,嘉实京东仓储物流封闭式基础设施证券投资基金(简称“京东仓储REIT”)正式登陆上交所,投资者获得了机会,去分享京东三处物流园区的收益&a…

数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第五章数据建模与设计篇...

大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人。在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知…

分布式新闻项目实战 - 9.后台系统管理

佳能:感动常在 记得很早之前看过的一个广告:男子拿着妻子的相机发呆,父亲尝试安慰着他,然后接过相机给他拍了张照片,突然他进去了相机的世界,相机里的他一直给父亲做手势,直到父亲翻到了最后一张…

MySQL数据库02——SQL基本语言组成和数据类型

接着上一章的内容,上一章安装好了Mysql和对应的编译器workbench,并且简单的创造了一个数据库college,这一章我们学习SQL语言的一些基础。 首先了解一下基础。 Sql语言组成 sql 的一些基本定义语句的的用法。 操作对象 语句 功能 表 CRE…

leetcode 困难 —— N 皇后(简单递归)

(不知道为啥总是给这种简单的递归设为困难题,虽然优化部分很不错,但是题目太好过了) 题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个…

2023年信息与通信工程国际会议(JCICE 2023)

2023年信息与通信工程国际会议(JCICE 2023) 重要信息 会议网址:www.jcice.org 会议时间:2023年3月17-19日 召开地点:成都 截稿时间:2023年2月10日 录用通知:投稿后2周内 收录检索:EI,Scopus 会议简介…

干货 | 机器人的运动规划方法和应用现状

“如今,机器人正在更深入的服务于人类,它们要想完成的一些力所能及的操作,都需要依托于机器人的运动规划。本期技术干货,我们邀请到了小米工程师——‍孙国康,向我们介绍机器人的运动规划方法和应用现状。”一、前言近…

C++ 浅谈之 STL Deque

C 浅谈之 STL Deque HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&a…

舆情监测方案怎么写,TOOM舆情监测系统解决方案

舆情监测是通过网络和媒体来收集、分析、评估和报告关于某一特定话题或组织的舆论动态的过程。舆情监测方案通常包括数据收集、数据分析、报告生成等步骤,以帮助组织了解公众对其的看法和声音,并以此作出相应的决策和行动,舆情监测方案怎么写…

车道线检测-Eigenlanes 论文学习笔记

论文:《Eigenlanes: Data-Driven Lane Descriptors for Structurally Diverse Lanes》 代码:https://github.com/dongkwonjin/Eigenlanes 核心:在 Eigenlane Space 中检测车道线 创新点 Eigenlane:数据驱动的车道描述符&#xff…

Python中__init__.py文件深入理解

Python中文件__init__.py深入理解1. 简介1.1 模块(Module)和包(Package)的概念1.2 __init__.py文件简介2. __init__.py内容写法2.1 __init__.py文件内容2.2 __init__.py内容解释1. 简介 1.1 模块(Module)和…

这是从零在独自开开发,将是副业赚钱最好的平台!

文章目录最重要的事情放前面1.前言2.简单介绍一下3.【独自开】介绍3.1 分层标准化平台架构3.2 集成第三方数字接口3.3 支持各个行业的系统定制开发4.如何在【独自开】赚钱获取收益?4.1 如何称为【独自开】开发者?最重要的事情放前面 通过平台的审核也可以得到相应的奖金&…

信息系统建设和服务能力等级证书(CS)

2019年11月26日,中国电子信息行业联合会发布了《信息系统建设和服务 能力评估体系 能力要求》(简称《能力要求》)。《能力要求》是我国信息系统建设和服务能力领域的首个团体标准,旨在通过该标准的实施提升信息系统建设和服务行业…

Linux学习之冯诺依曼体系结构

目录冯诺伊曼结构体系基本概念冯诺依曼结构分为五个部分组成冯诺依曼结构体系的各部分的读写特点:从软件数据上认识冯诺依曼结构体系冯诺伊曼结构体系 基本概念 数学家冯诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机…

JVM相关面试题

文章目录说一下 JVM 的主要组成部分及其作用?说一下 JVM 运行时数据区 ?JVM中哪些是线程共享区 ?说一下堆栈的区别?队列和栈是什么?有什么区别?简述Java类加载机制?说一下类装载的执行过程?什么…