前端网络---http缓存

news2024/11/26 16:30:21

什么是http缓存?

1、HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。

2、缓存的原理是在首次请求后保存一份请求资源的响应副本,当用户再次发起相同请求时,判断缓存是否命中,如果命中则将前面的响应副本返回给用户

3、使用缓存可以减少HTTP请求的数量,减少HTTP响应的大小,使web页面加载得更快。

memory cache和disk cache

memory cache:即内存缓存,存储在浏览器内存中,在访问页面后,再次刷新页面,可以发现很多数据来自Memory Cache(即内存缓存)

优点:

1、获取速度快;优先级高,当资源加载时,浏览器率先查找内存(memory cache)是否存在,存在则直接加载,不存在则找磁盘(disk cache)是否存在,存在则获取,不存在就进行网络请求。

缺点:

1、生命周期短,当网页的tab页面被关闭后(刷新不会),内存就会释放;且计算机内存的大小有限

disk cache:即磁盘缓存,存储在计算机硬盘中

优点:

1、存储容量大;生命周期长,只要不删除就一直存在

缺点:

1、读取速度相对memory cache较慢

http缓存方式

1、http缓存分为两种缓存,分别是强制缓存协商缓存

2、强缓存的优先级比协商缓存高

缓存图解,下面详细分析

http缓存---强制缓存

强制缓存过程:

客户端请求数据时判断有没有缓存数据存在,存在的话再判断缓存数据有没有过期,如果没有过期则直接使用缓存数据,无需与服务端进行通信

判断缓存是否过期是关键,下面就开始了

http1.0实现强制缓存的方法

如上图所示,Web服务器使用Expires响应头来告诉Web客户端它可以使用某个资源的缓存数据(副本)直到指定的时间为止

缺点:

Expires时间是服务端的时间,浏览器会将其与客户端的时间进行比对,这就可能导致客户端的时间和服务端的时间不一致,因为用户可以随意修改客户端的时间,这就会导致缓存命中的误差。

http1.1实现强制缓存的方法

引进了Cache-Control头来克服Expires头的限制

Cache-Control的常用属性有

1、max-age

1.1、可以指定缓存的生命周期(即被缓存多久)。它以秒为单位定义来一个更新窗。

1.2、Cache-Control是HTTP1.1的产物,其优先级比Expires高。如果两者同时出现,HTTP规范规定Cache-Control的max-age指令将重写Expires头。

2、private/public

2.1、public表示该响应可以被任何对象(包括:发送请求的客户端、代理服务器等等)缓存

2.2、private:私有缓存,表示该响应只能被发送请求的客户端缓存,而代理服务器等等其他不能缓存

2.3、private/public 未设置时,默认为private

3、no-cache

3.1、no-cache 不是禁止一切缓存的意思,而是强制客户端向服务端发送请求判断资源是否变更,变更则返回变更后的数据,未变更则返回304。即no-cache是禁止没有重新验证的情况下使用缓存,可以理解为不使用强缓存,使用协商缓存

4、no-store

4.1、no-store 表示该响应禁用缓存,不将响应存储在任何缓存中。

5、s-maxage

5.1、s-maxage:“s”表示共享,该字段和max-age类似,用于设置缓存时长,优先级高于max-age或Expires,但该字段仅在代理服务器(如CDN等)生效,仅当设置了public才有效。

http缓存---协商缓存

协商缓存过程:

强缓存的优先级比协商缓存高。当强制缓存没有命中(例如max-age过期),或者Cache-Control设置了no-cache(上文说到的),则开始进行协商缓存。

使用协商缓存时,客户端会携带缓存数据标识会向服务端发送一个请求,服务端识别对应的数据是否失效,如果未失效则返回304状态码,通知客户端比对成功,可以使用缓存数据。如果失效则返回最新数据,状态码为200。

下面就是协商缓存的具体分析

HTTP1.0实现协商缓存的方法------Last-Modified和If-Modified-Since

1、客户端首次请求一个资源时,服务端返回的header中如果有加上Last-Modified,其表示该资源的最后修改时间

2、那么当客户端后续再次请求该资源时,会在发送的请求头中携带If-Modified-Since,其值和之前返回的Last-Modified一致

3、服务端就会收到If-Modified-Since值,再根据资源最新的最后修改时间进行判断缓存是否失效。如果缓存命中(缓存有效),则返回空响应体, 状态码为304,也不会返回Last-Modified字段。如果缓存失效,则返回最新数据,并返回Last-Modified字段,状态码为200。

缺点:

1、Last-Modified和If-Modified-Since的检查时间最小单位是秒,如果资源在一秒以下的时间完成了更新,则资源最后修改时间(Last-Modified)不变,但实际资源已经变了,这时客户端的缓存是失效的,然而这种情况服务端依然会判断缓存命中。

2、如果资源进行了编辑操作,但是实际资源的内容没有修改,这时最后修改时间(Last-Modified)变了,这种情况服务端判断缓存失效,重新返回了新数据。而实际上是不需要的,因为文件内容没变。

HTTP1.1实现协商缓存的方法------Etag和If-None-Match

1、Etag是由服务端生成的用于标识资源的唯一标识符。

2、浏览器首次请求一个资源时,服务端根据资源内容生成一段hash字符串,加在返回的header中的Etag字段上,如下图

3、当客户端后续再次请求该资源时,会在发送的请求头中携带If-None-Match,其值和之前返回的Etag一致。

4、服务端就会收到If-None-Match值,并再次读取资源内容的Etag值进行匹配。如果缓存命中(缓存有效),则返回空响应体, 状态码为304。如果匹配失败,则缓存失效,返回最新数据,包括新的Etag字段,状态码为200。

5、Etag和If-None-Match的校验优先级比Last-Modified和If-Modified-Since高。

缺点:

1、但是由于Etag的生成需要服务端的计算开销,资源越大越多,开销就越重,会影响服务端的性能

浏览器用户行为和缓存

1、地址栏回车、页面链接跳转、页面前进/后退等等这些用户行为都是按照正常的缓存检查流程进行

2、而当用户点击刷新按钮时,浏览器会对本地的缓存文件过期,但是If-Modified-Since和If-None-Match还是会带上,意味着还是可能进行协商缓存

3、当用户进行强制刷新的操作时,浏览器不仅会对本地的缓存文件过期,而且也不会带上If-Modified-Since和If-None-Match,意味着相当于全部重新第一次请求。

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

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

相关文章

在Linux操作系统中文件目录特殊权限

管理员用户和普通用户都可以使用passwd命令来给用户设置密码 用户密码保存在/etc/shadow suid 4 sgid 2 sticky bit 1 suid(只要是针对可执行文件进行设置。) {当没有操作要求时,不可以擅自对shell,python脚本加上suid权…

dbeaver数据库语言编辑器设置jdbc驱动

打开 dbeaver 软件 数据库 -> 驱动管理器 以mysql为例 双击 MySQL -> 库 -> 添加工件 然后 打开maven组件库 官网 找到mysql驱动对应的maven工件地址 复制进去然后确认就行了 参考 大神博客

48.基于SpringBoot + Vue实现的前后端分离-雪具销售系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的雪具销售系统设计与实现管理工作系统…

【测试思考】做比开发、产品还熟悉业务的测试

有时一个边缘功能很久很久不改动,那再需要测通它时,经常需要对接多方,有的请假了有的调走了有的不清楚更甚者有时候一个功能找不到清楚的人....... 当没有可查阅的文档或记录,找不到完整的信息时,咋办? 当…

n皇后问题-java

本次n皇后问题主要通过dfs(深度优先搜索)实现,加深对深度优先搜索的理解。 文章目录 前言 一、n皇后问题 二、算法思路 三、使用步骤 1.代码如下 2.读入数 3.代码运行结果 总结 前言 本次n皇后问题主要通过dfs(深度优先搜索&#…

027——从GUI->Client->Server->driver实现对SR501的控制

目录 1、修改显示界面 2、 添加对SR501显示的处理和tcp消息的处理 3、 在服务器程序中添加对SR501的处理 4、 编写驱动句柄 5、 修改底层驱动 1、修改显示界面 有个奇怪的问题这里的注释如果用 就会报错不知道为啥,只能用#来注释 我把显示这里需要显示的器件的…

宝塔要注意的问题

数据库创建访问权限要全部人 反向代理1 打包dist,并不会有反向代理,所以宝塔里面要配置 反向代理2 这种去掉/api为/,上面的并没有去掉 rewrite ^/api/(.*)$ /$1 break;

mysql数据库表的数据显示到前端tableView

首先我们在ui视图设计中引入TableView, 定义一个model QSqlQueryModel *modelnew QSqlQueryModel(ui->tableView);model->setQuery(query);//将查询结果绑定到模型上ui->tableView->setModel(model); 将tableView内容设置成model然后就可以出现数据库的数据。示…

企业网站制作如何被百度收录

1、网站在百度中的整体评分 说俗点就是网站的权重,在优化过程中我们会见到很多网站出现秒收的情况,发布的文章几分钟就可以收录,这个通过SITE语法都可以去查询,那么这跟自己的网站权重以及内容更新习惯是有非常重要的关联。 我们…

Python-Qt上位机设计

1.下载designer软件 2.自己设计一个界面 3.在指定部件加入点击响应命令函数名 鼠标点击目标部件拖出信号线 4.保存生成.ui文件,用pycharm打开 5.生成.py文件 6.新建一个功能文件 上图中class MainWindow的具体代码不予展示。 7.生成exe文件 将写好的py文件保存&a…

产品推荐 | 基于Anlogic系列EG4S20 FPGA开发板

1、产品概述 国产FPGA是最近几年起来的产品。ANLOGIC 是国产FPGA组织一成员,ANLOGIC芯片具有性价比高特点。高云FPGA,很多用户都用在LED,电机控制,PLC设备上,接口扩展。在国产化平台,Altera ,L…

Solaris安装Oracle RAC配置手册

一. Oracle RAC安装前的系统准备工作 检查安装包 ​pkginfo –i SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo pkg install SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo 1.1 创建系统用户和组(两节点都要执行 ro…

Python相关性分析

分析连续变量之间线性相关程度的强弱,并用适当的统计指标表示出来的过程称为相关分析。 可以直接绘制散点图,或者绘制散点图矩阵,或者计算相关系数来进行相关分析。 相关系数的计算如下所示: 示例数据: 计算百合酱蒸…

本地启用并操作Redis

本篇文章将向各位讲解redis的基础用法,废话不多说我们直接开始吧! 首先需要下载redis到你本地,我这儿是下载到以下文件夹中: 双击redis-server.exe文件运行redis: 然后我们另外启用一个命令窗口(需要进入你…

JDK11安装教程

文章目录 1、安装2、配置环境变量 1、安装 双击安装包,点击下一步 更改安装目录,点击下一步 等待安装完成 安装完成 2、配置环境变量 此电脑右键属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> 新建 变量名:JAVA_HOME变量…

发布!DolphinDB 白皮书正式上线官网!

对广大数据库用户而言,白皮书是极具参考价值的使用指南和学习手册。白皮书不但能深入剖析数据库的基础概念与架构,协助用户了解数据库的工作原理和应用技巧,更提供了丰富的实践案例,帮助用户从中汲取经验,避免在实际应…

Java 实际项目开发中最少必要知识汇总

一、面向过程和面向对象 程序设计语言分为面向过程和面向对象 对于面向过程,强调的是过程,关心的是我去做 对于面向对象,强调的是对象(万物皆对象),更关心的是我该让谁去做,这里的谁指的就是对象…

AutoCoder 副作用,秒变命令行版Siri,再也不用复制黏贴命来管理大模型了

AutoCoder 可以通过你指定的文档,以及自动到搜索引擎进行搜索来获取信息,从而更好的帮你生成代码,但我们不满足,我们还希望能够对用户本地的文档进行索引,从而自动获取一些信息,帮助你本地的项目更好的迭代…

如何进行数据库的迁移与同步——【DBA 从入门到实践】第四期

在日常的数据库运维工作中,我们时常会面临数据库替换、机房搬迁、业务测试以及数据库升级等任务,这些任务都需要对数据进行迁移和同步操作。【DBA 从入门到实践】第4期,将引导大家深入了解数据库迁移的流程,并探讨在迁移过程中可用…

设计模式胡咧咧之策略工厂实现导入导出

策略模式(Strategy Pattern) 定义: 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 本质: 分离算法,选择实现 应用场景 何时使用 一个系统有许多类,而区分他们的只是他们直接…