syslog 向内存中缓存_动画:深入浅出从根上理解 HTTP 缓存机制及原理!

HTTP 缓存,对于前端的性能优化方面来讲,是非常关键的,从缓存中读取数据和直接向服务器请求数据,完全就是一个在天上,一个在地下。

我们最熟悉的是 HTTP 服务器响应返回状态码 304,304 代表表示告诉浏览器,本地有缓存数据,可直接从本地获取,无需从服务器获取浪费时间。

至于为什么被缓存,如何命中缓存以及缓存什么时候生效的,我们却很少在实际开发中去了解。今天小鹿借助动画形式来从根上理解 HTTP 缓存机制及原理。

为什么会有缓存?

8f0b3c6a9ca4a66f6245a8ee9205fe99.png

单纯的从计算机角度去说,比较抽象,咱们看一个实际的例子。比如,我们通常喜欢把没看完的书放在书架上,而看完以及没有看的书放在箱子中保存。

如果我们把所有的书保存在箱子中,每次看书都要去箱子中找,所以非常麻烦和耗时(这里的箱子,可以想象成服务器)。

当我们开始看新书时,第一次从箱子中取出,看了一半,然后我们直接放到书架上,当下次再看书的时候,直接从书架中取出,这里的书架,就是我们下边要讲到的缓存(一个缓存仓库)。

缓存的“龟”则

8f0b3c6a9ca4a66f6245a8ee9205fe99.png

当浏览器发出请求到数据请求回来的过程,就像是上述中的取书过程。

浏览器在加载资源时,根据请求头的Expires 和 Cache-control 判断是否命中强缓存,是则直接从缓存读取资源,不会发请求到服务器。

如果没有命中强缓存,浏览器一定会发送一个请求到服务器,通过 Last-Modified 和 Etag 验证资源是否命中协商缓存,如果命中,服务器会将这个请求返回,但是不会返回这个资源的数据,依然是从缓存中读取资源。

如果前面两者都没有命中,直接从服务器加载资源。

动画演示

8f0b3c6a9ca4a66f6245a8ee9205fe99.pngb7418a1afe304e5ccc361d69f78cfe97.gif

HTTP 缓存分类

8f0b3c6a9ca4a66f6245a8ee9205fe99.png

上述讲到,HTTP 是有“龟”则的,根据浏览器是否向服务器发起请求来分为强缓存和协商缓存

1、强缓存

强缓存的意思就是不向服务器发起请求的缓存,也就是本地强制缓存。浏览器想要获取特定数据的时候,首先会检查一下本地的缓存是否存在该数据,如果存在,就直接在本地获取了,如果不存在,就向服务器所要该数据。

详细请求过程如下动画所示:

70a532fc94f543e7bded524a1445a1a1.gifc6b35b2889eaa83dac8a1b0008f5708c.gif

那么问题来了,如果我们想使用强缓存,那怎么判断缓存数据什么时候失效呢?

当浏览器向服务器请求数据的时候,服务器会将数据和缓存的规则返回,在响应头的 header 中,有两个字段 Expires和Cache-Control。

Expires

1expires: Wed, 11 Sep 2019 16:12:18 GMT

在响应头中 Expires 字段的意思是,当前返回数据的缓存到期时间戳。当浏览器在进行请求的时候,会那浏览器本地的时候和这个时间做对比,判断资源是否过期。

但是上述存在一个问题就是,如果我手动改变了电脑的时间,那么就会出现问题,这也是 HTTP1.0 中存在的问题。

Cache-Control

为了解决这个问题,在 HTTP1.1 中增加了 Cache-Control 这个字段。

1Cache-Control:max-age=7200

服务器和客户端说,这个资源缓存只可以存在 7200 秒,在这个时间段之内,你就可以在缓存获取资源。

如果 Expire 和 Cache-control 两者同时出现,则以 Cache-control 为主

除此之外,cache-control 还有其他字段可以使用。

1cache-control: max-age=3600, s-maxage=31536000
  • Public:只要为资源设置了 public,那么它既可以被浏览器缓存,也可以被代理服务器缓存;

  • Private(默认值):则该资源只能被浏览器缓存。

  • no-store:不使用任何缓存,直接向服务器发起请求。

  • no-cache:绕开浏览器缓存(每次发起请求不会询问浏览器缓存),而是直接向服务器确认该缓存是够过期。

2、协商缓存

浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。


再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。

bad7ad44d773b907de72404b2a4dce3c.gif6a07a28fe3c1cc3a8fd95671e22729c5.gif
1// 命中缓存的响应字段
2Request Method:GET
3Status Code: 304 Not Modified

怎么来识别协商缓存的?主要通过报文头部 header 中的Last-Modified,If-Modified-Since 以及ETag、If-None-Match 字段来进行识别。

Last-Modified 

Last-Modified 字段的意思是服务器资源的最后修改时间。第一次请求服务器,服务器的头部字段可增加这个字段,用于设置协商缓存。

1Last-Modified: Fri, 27 Oct 2017 06:35:57 GMT

当浏览器再次发起请求的时候,首部字段增加 If-Modified-Since 本地时间戳字段发给服务器。

1If-Modified-Since: Fri, 27 Oct 2017 06:35:57 GMT

服务端接收到请求之后,就拿 If-Modified-Since 字段值和本身的过期时间对比。

如果请求头中的这个值小于最后修改时间,返回的 304 响应,让其在本地浏览器缓存取出数据。如果时间过期,并在 Response Headers中添加新的 Last-Modified 值返回给浏览器。

但是 Last-Modified 存在一个局限性,有以下两种情况:

不该请求,还会请求。编辑了文件,文件内容没有变,但是服务器确认为我们改动了文件,所以重新设置了缓存时间,当做新请求返回给浏览器。

该请求,反而没有请求。修改文件速度很快,快过 If-Modified-Since 字段时间差的检测,文件虽然改动了,但是并没有重新生成新的资源。

ETag

ETag 代表的意思是标识字符串。由于上述 Last-Modified 字段存在的缺陷,所以在 HTTP / 1.1  我们对资源进行内容编码,只要内容被改变,这个编码就不同。

和上述请求原理一样,浏览器首次发起请求,然后服务器在响应头返回一个标识字符串。

1ETag: W/"2a3b-1602480f459"

浏览器再次发起请求,携带一个值相同的字符串。

1If-None-Match: W/"2a3b-1602480f459"

服务端接收到该字符串就会作对比,如果相同,则让其读取本地缓存,否则,将新的资源返回给浏览器端。

缓存位置

8f0b3c6a9ca4a66f6245a8ee9205fe99.png

缓存的位置按照获取资源请求优先级,缓存位置依次如下:

  • Memory Cache(内存缓存)

  • Service Worker(离线缓存)

  • Disk Cache(磁盘缓存)

  • Push Cache(推送缓存)

Memory Cache

Memory 为内存缓存,是浏览器最先尝试命中的缓存,也是响应最快的缓存。但是存活时间最短的,当进程结束后,tab 标签关闭后,缓存就不存在了。

df4cc96b159555e07b4bef757c8d7872.png

因为内存空间比较小,通常较小的资源放在内存缓存中,比如 base64 图片等资源。

Service Worker

Service Worker 是一种独立于主线程之外的 Javascript 线程。它脱离于浏览器窗体,因此无法直接访问 DOM。

可以帮我们实现离线缓存、消息推送和网络代理等功能。

Disk Cache

内存的优先性,导致大文件不能缓存到内存中,那么磁盘缓存则不同。虽然存储效率比内存缓存慢,但是存储容量和存储市场有优势。

Push Cache

它是最后一道缓存命中,属于 HTTP2 的内容。如果感兴趣的同学,可以先去了解了解。

-------------------------

❤️爱心三连击

如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:

  1. 点个「在看」,让更多的人也能看到这篇内容

  2. 欢迎关注我的5000+star文章合集 https://github.com/ljianshu/Blog,希望可以带给你点启发!

  3. 如果想进前端交流群一起探讨技术,请在后台回复「1

轻点在看,支持作者❤️

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

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

相关文章

c++结构体嵌套结构体_Go学习每日一问(13)-结构体嵌套

每次学习并整理一个Golang的知识点,每天进步一点点。今天学习一个go结构体嵌套的知识点。日省吾身1.下面这段代码的输出结果?func main() { a : -7 b : 7 fmt.Printf("%d %d", a, b)}A. -7 7B. 7 7C. 7 7D. 7 -72.判断下面代码是否…

ddd 访问权限_基于DDD的微服务设计和开发实战

作者:欧创新、邓頔、文艺你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案。本文是基于 DDD 的微服务设计和开发实战篇&#xff…

里能嵌jquery吗_白芸豆里的淀粉阻断成分,能帮助减肥是真的吗?

原创 | 芙蓉营养师减肥偏方年年有,最近群里好多妹纸在问白芸豆是不是真的这么神奇?据说能阻断淀粉帮助减肥,很多人不仅囤了好多白芸豆,还有人买的是白芸豆提取物做成的液体饮料,价格真心不便宜,一小盒就一百…

华为鸿蒙系统是指芯片吗_华为首部鸿蒙手机P50——不再使用麒麟芯片,拍照系统再升级...

12月16日,华为如期上线了鸿蒙OS2.0Beta 版本手机系统。最初版本支持P40、Mate 30系列和平板 MatePad Pro。不过,想升级尝鲜的朋友可能要失望了。华为此次发布的鸿蒙系统属于开发者版本,主要目的是开放系统给开发者们做软件适配。根据上手体验…

3c vrrp的接口监视_主备冗余协议,VRRP基础,状态机选举及VRRP配置,理论+实战...

一、VRRP基础概念1、虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数…

去除标题_你真的会写标题吗?企优托教您打造黄金标题离不开这三步

一、标题作用解读标题对于产品的意义买家购买逻辑想到一款产品,并知道他的名称去网上搜索,看到图片等信息类比价格评价等内容,下单收到货和自己根据标题照片评判商品核心要点:买家是根据产品名字作为购买切入点;照片和…

18f458中断入口C语言_操作系统开发之——中断

这里先提交一个代码的错误,之前运行过快,没看出刷屏的问题:// kernel/console.c...void init_console(void) {... // Before: // console_fixed_height ScreenHeight - 16; // console_fixed_height (ScreenHeight / 16 - 1) *…

可选版本 安装软件_【Linux软件】在Deepin系统下安装LibreOffice 6.1.4版本的方法

在Deepin系统下安装LibreOffice 6.4.1版本的方法使用的是Deepin系统,从深度应用商店看到有LibreOffice,安装了一下,发现ui是真的丑,就像是十年前的xp那样,记得前段时间在Windows用的时候UI基本重写了,发生了…

的表格点击全选_“逼死”强迫症的杂乱表格,原来3秒就能整理好!(必学)...

点击上方蓝字关注星标★不迷路本文作者:长小安视频策划:视频小分队本文编辑:竺兰哈喽大家好!你们可爱的小安又来啦~相信在工作中经常接触表格的人,总会有这样的困扰:表格数据太多,行高列宽不合适…

linux 重置网卡配置_Linux不进入网卡配置文件更改静态ip

1、找到网卡配置文件名ls /etc/sysconfig/network-scripts/2、备份并查看原始配置文件(若原先有配置IP的,则按照第五点方式修改)3、修改随机自启和IP地址echo -e "IPADDR192.168.43.12 \nNETMASK255.255.255.0 \nGATEWAY192.168.43.1" >> /etc/sysc…

mysql从盘延迟_Mysql-主从延迟解决方法

Mysql 的主从延迟 指的是 主库受写入 后 到这个写入能体现在 从库上 的这段时间Mysql 的主从延迟 有两个原因:1. 写操作 已经在 主库中执行了,但是 binlog 还没有发送出去, 后者还在路上,没有被 从库收到2. 虽然 binlog 已经被 从…

php程序访问mysql数据实现查询_PHP+MySql实现后台数据的读取

我们使用的是PHP的php_mysqli扩展首先了解一些基础的用法1.连接数据库使用mysqli_connect()参数:①主机地址 ②MYSQL用户名 ③MYSQL密码 ④选择连接的数据库 ⑤端口号返回:如果连接成功返回资源类型的标识符号,如果失败返回false如果我们与My…

idea测试连接mysql报错08001_IDEA连接MySQL(版本8)数据库失败的解决方法(报错08001)...

在IDEA自带的数据库连接工具中,可以连接MySQL数据库,但是有的时候连接出现08001错误,连接不上数据库。1、一般配置如下所示Database处填写数据库名字;User处填写mysql设置好的用户名;密码同理填写设置好的;…

信息管理系统 github_Java+MySQL实现学生信息管理系统

基于Java swingMySQL实现学生信息管理系统:主要实现JDBC对学生信息进行增删改查,应付一般课设足矣,分享给大家。源码:https://github.com/ZhuangM/student.git1、 开发环境:jdk7MySQL5win7代码结构:model-d…

smith标准型_线性系统理论(八)多项式矩阵Smith-McMillan标准型计算方法

1 参考[1]Chenglin Li:线性系统理论(七)finite- and infinite-zeros​zhuanlan.zhihu.com多项式矩阵Smith-McMillan标准型确定方法分析2 单模矩阵法Chenglin Li:线性系统理论(七)finite- and infinite-zero…

mysql explain insert_简述Mysql Explain 命令

MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP)。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息帮助你做出调优决策。参考官方文档地址:为什么用explain . 如果你的页面返回结果很…

mysql数据库初识实训总结_MySQL(数据库)的初识

1.什么是数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库2.什么是MySQLMySQL 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL 是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。3.关系数…

jdk1.8要安装什么mysql_Window下安装JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程图解

JDK1.8安装下载打开链接: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html.下拉选择不同jdk版本,图示为window系统下载提示需登录账号可查看这个帖子Oracle账号.安装双击下载的安装包,按提示走就可以安装完成之后…

php mysql bootstart_PHP MySQL 创建数据库

PHP MySQL 创建数据库数据库存有一个或多个表。你需要 CREATE 权限来创建或删除 MySQL 数据库。使用 MySQLi 和 PDO 创建 MySQL 数据库CREATE DATABASE 语句用于在 MySQL 中创建数据库。在下面的实例中,创建了一个名为 "myDB" 的数据库:实例 (…

中班机器人歌曲_机器人幼儿园大班音乐教案

机器人幼儿园大班音乐教案作为一名无私奉献的老师,有必要进行细致的教案准备工作,教案是教学活动的总的组织纲领和行动方案。那么问题来了,教案应该怎么写?以下是小编为大家收集的机器人幼儿园大班音乐教案,供大家参考…