HTTP 缓存

news/2024/9/20 7:17:30/ 标签: 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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

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


http://www.ppmy.cn/news/1519116.html

相关文章

基于python的人力资源管理系统/基于django的OA系统的设计与实现

摘 要 随着当今社会的发展,时代的进步,各行各业也在发生着变化,比如人力资源管理这一方面,利用网络已经逐步进入人们的生活。传统的人力资源管理,都是员工去公司查看部门信息、招聘信息,这种传统方式局限性…

k8s Failed to delete cgroup paths

问题 Aug 26 10:29:27 bjm1 systemd[1]: Stopping libcontainer container 6b55a1165ba1f974ee460d84832a4ee1df0ea36899498120c997cce518c2e7e0... Aug 26 10:29:37 bjm1 dockerd[152737]: time="2024-08-26T10:29:37.453518079+08:0

E. Sheep Eat Wolves

https://codeforces.com/gym/104869/problem/E 赛时队友想贪心,贪不了一点,我想了数学办法每次都送固定的发现送过去就不满足了 赛后补,暴力做O(n4) 至少要几次才能把安全所有羊送到对岸去 考虑最短路,bfs,用数组存下所有状态 …

dbc转换成excel

‌要将DBC文件转换为Excel格式,可以使用Canoe软件进行导出。‌ 使用Canoe软件将DBC文件导出为Excel格式的具体步骤如下: 打开Canoe软件,并在项目工程中加载或创建一个DBC文件。在主菜单中选择“文件”>“导出”>“数据库”选项。在打…

C++ 两线交点程序(Program for Point of Intersection of Two Lines)

示例图 给定对应于线 AB 的点 A 和 B 以及对应于线 PQ 的点 P 和 Q,找到这些线的交点。这些点在 2D 平面中给出,并带有其 X 和 Y 坐标。示例: 输入:A (1, 1), B (4, 4) C (1, 8), D (2, 4) 输出:给定直…

百度文库文章-暂存下-------题 目: 链式简单选择排序

题 目: 链式简单选择排序 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务: (包括课程设计工作量…

点儿企业规范

常见命名风格介绍 大驼峰:所有单词首字母都需要大写,UserController小驼峰:除了第一个单词,其他单词首字母大写,userController蛇形:用下划线 _ 作为单词间的分隔符,一般小写,user_…

阿里云Ubuntu系统安装/简单使用Kafka

一、安装kafka 1.下载安装包 1.1下载地址 https://kafka.apache.org/downloads 注意: 版本可以随意选择,我们选择版本为2.4.1 2.压缩文件上传/解压 2.1上传 2.2解压文件 #解压文件指令 tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/ #创建软…

Linux网络:TCP UDP socket

Linux网络:TCP & UDP socket socket 套接字sockaddr网络字节序IP地址转换bzero UDP socketsocketbindrecvfromsendto TCP socketsocketbindlistenconnectacceptsendrecv 本博客讲解 Linux 下的 TCP 和 UDP 套接字编程。无论是创建套接字、绑定地址,还…

【算法基础实验】图论-Dijkstra最短路径

理论知识 边的放松 边的放松(Edge Relaxation)是图算法中的一个关键操作,主要用于解决最短路径问题。它的核心思想是在遍历图的过程中,通过比较和更新路径的长度,逐步找到从起点到每个顶点的最短路径。 边的放松过程…

使用 Pandas 进行数据可视化:全面指南(六)

在数据分析的过程中,数据的可视化是一个至关重要的环节。通过图形展示数据,不仅能够帮助我们直观地理解数据,还能够揭示数据背后的规律和趋势。Pandas 作为 Python 生态系统中强大的数据分析库,不仅提供了数据处理和分析的功能,还内置了方便易用的可视化方法。本文将详细介…

AD19基础应用技巧:捕捉对象功能的讲解鼠标”绿色十字”大光标、小光标切换

AD PCB 中心点捕捉功能: 线段、圆、边框中心点捕捉。 有时候不想要鼠标自动捕捉中心点怎么办? 关于Altium Designer 20 的捕抓功能的讲解(https://blog.csdn.net/weixin_44599693/article/details/126177841) ——- AD PCB画板…

服务器上部署Wordpress:Docker技术教程

今天在三丰云免费服务器上进行部署测试,这款不错的免费服务器配置为1核CPU、1G内存、10G硬盘、5M带宽,给人惊喜。三丰云免费服务器的性能稳定,让我可以尽情发挥技术的魔力。 Docker是一种轻量级容器技术,而Wordpress则是广受欢迎…

C++国密SM2算法加解密的使用

目录 效果 在线校验 代码实现参考 项目 下载 效果 加密字符串:lxw 123abcD 2024-09-01:12:00加密后信息:042E82EE8ACE2BD56FA71DC6A0C34190627AA365F8EEE6261903BEE327A85EB5E1D6E78F2D79AD6F6DC9E45C0829625DC3165BB78BD897F99044A640F930653747939CF9D5A10C8216F945A559…

【Leetcode 2357 】 使数组中所有元素都等于零 —— 哈希表

给你一个非负整数数组 nums 。在一步操作中,你必须: 选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。nums 中的每个正整数都减去 x。 返回使 nums 中所有元素都等于 0 需要的 最少 操作数。 示例 1: 输入&am…

【手撕数据结构】二叉树oj题

目录 单值二叉树题目描述题目思路及代码 相同的树题目描述题目思路及代码 对称二叉树题目描述题目思路及代码 另一棵树的子树题目描述题目思路及代码 二叉树的前序遍历题目描述题目思路及代码 二叉树的构建与遍历题目描述题目思路及代码 单值二叉树 题目描述 题目思路及代码 …

10、Flink 动态表之表到流的转换详解

表到流的转换 动态表可以像普通数据库表一样通过 INSERT、UPDATE 和 DELETE 来不断修改,它可能是一个只有一行、不断更新的表,也可能是一个 insert-only 的表,没有 UPDATE 和 DELETE 修改,或者介于两者之间的其他表。 在将动态表转换为流或将其写入外部系统时,需要对这些…

JVM GC 调优

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II JVM GC 调优基本概念: 应用程序的响应时间(RT)和吞吐量(QPS)JVM调优原理调优思路调优方法JVM调优技巧建议引言 内存参数:ht…

为Ubuntu换颗“心”

对于现在的Linux发行版操作系统,都默认配置好相应的Kernel,但其版本远比最新的要旧,而最新的Kernel除了会修复已发现的BUG,有时还会更新部分框架以及新增功能模块代码,为了确保系统的稳定,还有体验下新功能,我们只好对操作系统的进行换“心”手术,这手术可不简单,首先…

Go 语言版本管理——Goenv

Go 语言版本管理——Goenv 命令安装 goenv安装和切换 Go 版本 goenv 是一个专门管理 Go 语言版本的工具。 命令 安装 goenv github-goenv git clone https://github.com/go-nv/goenv.git ~/.goenv echo export GOENV_ROOT"$HOME/.goenv" >> ~/.bash_profile…