图解浏览器缓存,教你提高用户体验

2023-11-10

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由前端林子发表于云+社区专栏

浏览器缓存,是浏览器端保存数据,用于快速读取避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求加快页面速度,从而提高用户体验。

一 强缓存

1.1 区分Expires和Cache-Control

以一个接口返回的响应头为例:

img

这里我画了张思维导图,对Expires和Cache-Control做比较:

img

具体介绍Expires和Cache-Control:

Expires:

(1)Expires是HTTP1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略;

(2)Expires规定了缓存失效时间(Date为当前时间),是绝对时间。由于Expires返回的是一个绝对时间,在服务器时间与客户端时间相差较大的时候,缓存命中不准确;

Cache-Control:

(1)Cache-Control是HTTP1.1的

(2)Cache-Control的max-age规定了缓存有效时间(2552s),是相对时间;

(3)若响应头Expires和Cache-Control同时存在,Cache-Control优先级高于Expires

Cache-Control的常用指令:

no-cache:不使用本地缓存,需要使用协商缓存,也就是先与服务器确认缓存是否可用。

no-store:禁用缓存。用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

public:其他用户也可使用缓存,适用于公共缓存服务器的情况。

private:只有特定用户才能使用缓存,适用于公共缓存服务器的情况。

max-age:客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

min-fresh客户机可以接收响应时间小于当前时间加上指定时间的响应。

max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

注意:no-cache指令并不是不缓存,no-cache的意思是可以缓存,但每次用应该去向服务器验证缓存是否可用。no-store才是不缓存内容。

1.2 强缓存的过程

**强缓存:**浏览器直接从本地缓存中获取数据,不与服务器进行交互。

· 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在response的header会加上Expires/Cache-Control的header;

· 浏览器再请求这个资源时,先从缓存中寻找,找到这个资源后,比较Expires或Cache-Control的max-age字段值做比较, 如果在有效期内,则读取缓存内容;若缓存已过期,则重新向服务器发送请求;

· header在重新加载的时候会被更新

这里我画了两张图,浏览器第一次请求:

img浏览器第一次请求

浏览器再次请求:

img强缓存

对于强缓存,chrome浏览器的状态码:

200 OK(from disk cache)或是200 OK (from memory cache)

例如:请求某个图片后,当浏览器再次访问这个图片时,发现有这个图片的缓存,且缓存没过期,所以就使用缓存。

当浏览器发现缓存过期后,缓存并不一定不能使用了。比如文件虽然过了有效期,但内容并没有发生改变,还是可以用缓存数据。所以,这个时候需要与服务器协商,让服务器判断本地缓存是否还能使用。那么又怎么判断服务端文件有没有更新呢?主要有两种方式:

Last-Modified,If-Modified-since。

二 协商缓存

2.1 区分Last-Modified和If-Modified-Since

以一个返回的接口为例:

img

Last-Modified的格式:

Last-Modified: Mon, 17 Sep 2018 12:06:18 GMT

If-Modified-Since的格式:

If-Modified-Since: Mon, 17 Sep 2018 12:06:18 GMT

2.2 Etag是什么

web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,ETag的值默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。

2.3 协商缓存的过程

浏览器第一次请求:

img浏览器第一次缓存

浏览器再一次请求:

img协商缓存

Last-Modified、If-Modified-Since:

· 浏览器第一次向服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified字段,表示该资源在服务器上的最后修改时间;

· 浏览器再次向服务器请求这个资源时,在request的header上加上If-Modified-Since字段,这个值就是上一次请求时返回的Last-Modified的值;

·服务器收到资源请求时,比较If-Modified-Since字段值和被请求资源的最后修改时间,若资源最后修改时间较旧,则说明文件没有修改,返回304 Not Modified, 浏览器从缓存中加载资源;若不相同,说明文件被更新,浏览器直接从服务器加载资源, 返回200;

·重新加载资源时更新Last-Modified Header

Etag、If-None-Match

· 浏览器第一次向服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上ETag字段;

·浏览器再次跟服务器请求这个资源时,在request的header上加上If-None-Match,这个值就是上一次请求时返回的ETag的值;

·服务器再次收到资源请求时,再根据资源生成一个新的ETag,与浏览器传过来If-None-Match比较,如果这两个值相同,则说明资源没有变化,返回304 Not Modified, 浏览器从缓存中加载资源,否则返回200 资源内容。与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化

2.4 为什么有了Last-Modified,还要用Etag呢?

HTTP1.1中ETag的出现主要是为了解决几个Last-Modified比较难解决的问题:

·一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

·某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

·某些服务器不能精确的得到文件的最后修改时间。

对于上述情景,利用ETag能够更加准确的控制缓存,因为ETag是服务器自动生成的资源在服务器端的唯一标识符,资源每次变动,都会生成新的ETag值。Last-Modified与ETag是可以一起使用的,但服务器会优先验证ETag

2.5 比较强缓存和协商缓存

基于上文对强缓存和协商缓存过程的解释,这里我把强缓存和协商缓存绘制在一张图里,方便比较,具体过程可以参照上文:

imghttp缓存

三 小结

本文主要通过图解介绍了http的缓存,具体包括强缓存和协商缓存。如有问题,欢迎指正。

相关阅读
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图解浏览器缓存,教你提高用户体验 的相关文章

  • 新的一期AIGC训练营,9月16日开启#一起build anything

    时间 9月16号 周六 10 00 17 00地点 上海请自备电脑 window系统最佳 Mac也可以 现在早鸟报名 享受优惠价格 999 人 原价 1699 人 名额先到先得 早鸟报名还能获赠 699 AIGC知识库会员名额 新的一期训练
  • SRAM和SDRAM的区别

    DRAM 动态随机存取存储器 需要不断的刷新 才能保存数据 而且是行列地址复用的 许多都有页模式 SRAM 静态的随机存取存储器 加电情况下 不需要刷新 数据不会丢失 而且 一般不是行列地址复用的 SDRAM 同步的DRAM 即数据的读写需
  • C语言 弱定义

    说明 函数名称前面加上 WEAK属性修饰符称为 弱函数 类似C 的虚函数 链接时优先链接为非weak定义的函数 如果找不到则再链接带weak函数 意义 这种自动选择的机制 在代码移植和多模块配合工作的场景下应用较多 例如前期移植代码 需要调
  • 完全卸载docker

    停止docker服务 systemctl stop docker 列出所有docker相关组件 yum list installed grep docker 删除上一条命令列出来的所有组件 yum y remove xxxx 谨慎操作 删除

随机推荐

  • 因果推断(五)——反事实,后悔药?

    反事实推断一个词概括就是 后悔 例子 还是以小夏开店为例 小夏请了A明星代言后 销售量虽然有提升 但是由于该明星的代言费很贵 导致最终还是亏本了 于是 小夏想要是当时没有请明星代言 会不会就不亏本了 推断没有发生过的事情 就是反事实推断 当
  • shell编程基础(四)-shell特殊符号

    目录 符号总览 1 输出 输入重导向 1 井号 comments 1 帐户的 home 目录 1 分号 Command separator 1 连续分号 Terminator 1 点 dot 2 string 单引号 single quot
  • k8s leaderelection

    const LEASELOCKNAME tes LEASELOCKNAMESPACE kube system func main LeaseLockID uuid New String client InitClientSet run fu
  • 少儿机器人编程与软件编程区别

    现在社会 机器人编程是一门博大精深 有着多学科融合性的课程 针对少儿方面 林林总总的相关编程培训也是层出不穷 格物斯坦来分析下这两者的区别所在 纯软件是个虚拟的世界 简单而完美 就像我们上学时所说的理想条件下 而真实世界太复杂了 并且总有意
  • 十分钟了解MES系统的发展历程和标准体系

    在20世纪70年代后期到21世纪这阶段 企业之间的主要竞争因素发生了较大的变化 客户对产品的需求逐渐多样化 制造企业的生产模式也开始由大批量的刚性生产变为了多品种 小批量的柔性生产模式 生产线也从以前的手工方式转为了以自动化的机器人生产线为
  • 使用R语言中的data

    使用R语言中的data table包进行数据操作和转换是非常高效和方便的 其中 melt函数是一个非常实用的函数 可以将数据表从宽格式转换为长格式 在本文中 我将详细介绍如何使用melt函数 以及通过源代码示例展示其用法和效果 1 什么是宽
  • Java什么情况下数据类型可以自动转换?什么情况下需要强制转换?

    在程序中 当把一种数据类型的值赋给另一种数据类型的变量时 需要进行数据类型转换 自动类型转换也叫隐式类型转换 指的是两种数据类型在转换的过程中不需要显式地进行声明 当把一个类型取值范围小的数值直接赋给另一个取值范围大的数据类型变量时 系统就
  • minikube:部署一个nginx应用

    通过run命令运行pod 创建pod minikube kubectl run nginx image nginx port 80 查看pod的ip minikube kubectl get pods o wide 遇到查看不到IP的问题可
  • 关于自定义视图容器(Container View Controller)

    苹果对UIViewController以及其使用有着非常详细的文档 UIViewController Reference ViewController Programming Guide 一 UIViewController 作为iOS开发
  • 惠普笔记本重装win10系统教程

    惠普PAVILION 15 AU034TX X0S89PA 重装系统教程 文章目录 惠普PAVILION 15 AU034TX X0S89PA 重装系统教程 1 Bios设置启动盘 2 开始重装系统操作 3 电脑基本设置 4 激活win10
  • python源程序执行的方式是边编译边执行吗_Python代码是编译执行还是解释执行?...

    有人在讨论 Python 代码是编译执行还是解释执行 这个问题还可以换一种说法 Python 是编译型语言还是解释型语言 回答这个问题前 我们先弄清楚什么是编译型语言 什么是解释型语言 所谓编译执行就是源代码经过编译器编译处理 生成目标机器
  • MySQL存储过程专题

    文章目录 MySQL存储过程 0 环境说明 1 使用说明 2 准备 3 语法 3 0 语法结构 3 1 变量及赋值 1 局部变量 2 用户变量 3 会话变量 4 全局变量 3 2 入参出参 3 3 流程控制 判断 if case 3 4 流
  • Python反编译exe

    TOC Python反编译exe 下载工具 1 python国内下载 https mirrors huaweicloud com python 建议使用 3 10一下的版本 2 下载 下载pyinstxtractor 网址 https gi
  • Python-pandas-画柱状图/饼图

    一 柱状图 import pandas as pd pandas的制图功能是构建在matplotlib之上的 import matplotlib pyplot as plt 1 使用pandas画图 datas pd read excel
  • git rm -r cached <dir>按层次遍历目录导致删除目录下文件时“未匹配任何文件“错误

    haypin MBP cpp cmake js java python main git add haypin MBP cpp cmake js java python main find ipath js o ipath build o
  • Qt窗口大小设置

    用Qt创建一个窗口 如何调整窗口的大小呢 1 setBaseSize 调用这个方法 1 setBaseSize 800 600 运行程序 发现一点效果都没有 注意我这里并没有使用setFixedSize setMaximumSize 因为虽
  • LightGBM原理简介

    1 LightGBM简介 Light Gradient Boosting Machine 是一个实现GBDT算法的框架 支持高效率的并行训练 并且具有以下优点 1 更快的训练速度 2 更低的内存消耗 3 更好的准确率 4 分布式支持 可以快
  • 智能指针详细解析(智能指针的使用,原理解析)

    本文转自努力的少年博主 https blog csdn net sjp11 article details 123899141 目录 一 智能指针的基本概念 二 智能指针的定义和使用 三 auto ptr 四 unique ptr 五 sh
  • 在群晖上安装Nextcloud-AIO详解

    本文是应网友 刘源 的要求折腾的 什么是 Nextcloud AIO Nextcloud AIO 就是 Nextcloud All in One 顾名思义就是一个 Nextcloud 的 All in One 版本 这是一个基于 Docke
  • 图解浏览器缓存,教你提高用户体验

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由前端林子发表于云 社区专栏 浏览器缓存 是浏览器端保存数据 用于快速读取或避免重复资源请求的优化机制 有效的缓存使用可以避免重复的网络请求和加快页面速度 从而提高用户体验 一