HTTP 缓存

一、概述

1.HTTP缓存的基本原理是将Web资源(如HTML,CSS,JavaScript,图片等)保存在客户端或中间代理服务器上,后续的请求可以直接使用客户端或代理服务器上缓存的资源,而不必重新从服务器上获取。

2.HTTP缓存分为强制缓存和协商缓存。

二、强制缓存

1.不需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端返回了缓存的过期时间(Expires 与 Cache-Control),没有过期就可以继续使用缓存,否则就需要继续从服务端获取。

2.Expires字段因时区差异、格式限制等原因已逐渐被Cache-Control字段取代。

三、协商缓存

1.需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端会将缓存标识(Last-Modified/If-Modified-Since 与ETag/If-None-Match)与数据一起返回给客户端,客户端将两者都备份到缓存中 ,再次请求数据时,客户端将上次备份的缓存标识发送给服务端,服务端根据缓存标识进行判断,如果返回HTTP状态码 304(Not Modified ,请求的资源自上次请求以来没有被修改),则表示客户端可以继续使用缓存。若资源已修改,则返回200状态码和新的资源内容。

2.协商缓存的实现主要通过HTTP请求头中的If-Modified-Since和If-None-Match字段,以及响应头中的Last-Modified(资源的最后修改时间)和ETag(资源的版本标识符)字段来完成。

3.资源更新后,可通过修改资源的URL或更新ETag和Last-Modified头来使缓存失效。

四、HTTP 状态码304的工作流程(资源自上次请求以来没有被修改)

1.初次请求

客户端第一次请求资源时,服务器会返回该资源及其缓存相关信息(如 Last-Modified 头部或 ETag)。

​2. 缓存请求

在后续请求中,客户端会带上之前缓存的相关信息(例如 If-Modified-Since 或 If-None-Match 头),以检查资源是否已被修改。

​3. 服务器响应

服务器检查资源的状态。如果自上次请求以来资源没有被修改,服务器会返回 304 Not Modified 状态码,告诉客户端可以继续使用缓存的资源。

客户端收到 304 响应后,使用缓存中的资源,而不需要从服务器下载。

五、HTTP缓存的优点

1.避免重复资源的下载,减少不必要的网络传输。

2.从缓存中获取内容可以提升页面加载速度。

3.减轻服务器压力。

六、总结

1.强制缓存优先于协商缓存。

2.强制缓存使用的的两个标识:

1)Expires

Expires 的值为服务端资源过期的时间(一个GMT格式的日期时间字符串),即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。到期时间是服务端生成的,客户端和服务端的时间可能有差别。

2)Cache-Control

Expires 有个时间校验的问题,所以 HTTP1.1 采用 Cache-Control替代 Expires。

Cache-Control 的取值有以下几种:

private: 客户端可以缓存。响应只能被单个用户缓存,不能被共享缓存存储。

public: 客户端和代理服务器都可缓存。

max-age=xxx: 资源被认为新鲜的最大时间。缓存的内容将在 xxx 秒后失效 。

no-cache: 需要使用协商缓存来验证缓存数据。 缓存内容但立即过期,每次请求都需要与服务器验证缓存的有效性。

no-store: 所有内容都不会缓存,强制缓存和协商缓存都不会被触发。

不允许缓存。

3.HTTP缓存应用在静态资源缓存、动态内容缓存、API接口缓存等场景中。

4.对于频繁更新的资源,应设置较短的缓存时间或采用协商缓存模式。

对于不常更新的资源,应设置较长的缓存时间或采用强制缓存模式。

5.在缓存资源发生变更时,应及时更新缓存信息,以确保客户端获取到最新的资源内容。

6.当资源过期时,客户端会向服务器发送一个验证请求,以检查资源是否发生了变化。

若资源已更改,则服务器返回新的资源,否则客户端继续使用缓存中的副本。

7.使用强制缓存时不会发送请求到服务器,使用协商缓存时会发送请求到服务器以验证资源是否更新。

8.在文件名中包含版本号或哈希值,可防止客户端使用旧版本的缓存文件。

9.敏感数据不应被缓存,或者使用HTTP头no-store来防止缓存。

10.缓存粒度

1)逐资源缓存:每个资源独立缓存。

2)分组缓存:将相关的资源组合在一起进行缓存,如CSS Sprites或JavaScript模块。

11.使用浏览器里的开发者工具可以监控和调试HTTP缓存的行为。


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

相关推荐
黑客Ela5 分钟前
网络安全中常用浏览器插件、拓展
网络·安全·web安全·网络安全·php
Gu Gu Study5 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
时光の尘20 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
qdprobot26 分钟前
ESP32桌面天气摆件加文心一言AI大模型对话Mixly图形化编程STEAM创客教育
网络·人工智能·百度·文心一言·arduino
以后不吃煲仔饭34 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师34 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者38 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟40 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟1 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink