前端面经 强缓存与协商缓存

news2024/11/28 22:44:54

前端面经 强缓存与协商缓存

图片多来自第三方平台

文章目录

  • 前端面经 强缓存与协商缓存
    • 适用场合
    • 浏览器缓存的过程
    • 缓存规则
      • 强缓存(本地缓存)
      • 协商缓存

缓存分为两种:强缓存和协商缓存,根据响应的header内容来决定

获取资源形式状态码发送请求到服务器
强缓存从缓存取200(from cache)否,直接从缓存取
协商缓存从缓存取304(not modified)是,通过服务器来告知缓存是否可用

强缓存相关字段有expirescache-control。如果cache-controlexpires 同时存在的话,cache-control 的优先级高于expires
协商缓存相关字段有Last-Modified/If-Modified-SinceEtag/If-None-Match

适用场合

因为服务器上的资源不是一直固定不变的,大多数情况下它会更新,这个时候如果我们还访问本地缓存,那么对用户来说,相当于资源没有更新,用户看到的还是旧的资源
所以我们希望服务器上的资源更新,浏览器就请求新的资源,没有更新就使用本地的缓存,以最大程度的减少因网络请求而产生的资源浪费

浏览器缓存的过程

  1. 在浏览器第一次发起请求时,本地无缓存,向web服务器发送请求,服务器响应请求,浏览器缓存。过程入下:
    在这里插入图片描述在这里插入图片描述
    在第一次请求时,服务器会将页面最后修改时间通过Last-Modified标识由服务器发送给客户端客户端记录时间;服务器还会生成一个Etag,并发送给客户端

  2. 浏览器后续再次进行请求时:
    在这里插入图片描述

  • 浏览器在请求某一资源时,会线获取该资源缓存的header信息,判断是否命中强缓存(是否由cache-controlexpires信息),若命中则根据cache-controlmax-age判断是否过期,没有过期直接从缓存中获取资源信息,包括缓存header信息;本次请求根本就不会与服务器进行通信
  • 如果没有命中强缓存,或缓存过期。浏览器会发送请求到服务器,请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/If-Modified-SinceEtag/If-None-Match),由服务器根据请求中的相关header信息来比对结果是否协商缓存命中
    • 若命中(requst header返回的If-None-MatchIf-Modified-Since与服务器的EtagLast-Modified相同),则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取
    • 否则返回最新的资源内容

304:如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或根据请求的条件)并没有改变,则服务器应当返回304状态码

缓存规则

强缓存(本地缓存)

直接从缓存中获取资源而不经过服务器,前提是资源没过期。

即如果资源没过期,就取缓存,如果过期了,则请求服务器。

如何判断资源是否过期呢,也就是说强缓存的规则怎么看?请添加图片描述
主要是看response header中的Cache-Control

Cache-Control设定值:

  • max-age=xxx:过期时间
  • no-cache:不使用强缓存(本地缓存)。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
  • no-store:不强缓存,也不协商缓存。直接禁止浏览器缓存数据,每次请求资源都会向服务器发送一个请求,每次都会下载完整的资源
  • public:浏览器和CDN等中间代理服务器都可以缓存
  • private:仅服务器缓存,不允许CDN等中继缓存服务器对其缓存

缓存保存的位置:

  • 内存缓存:具有两个特点,分别是快速读取和时效性
    • 快速读取:内存缓存会将百衲衣解析后的文件,直接存入进程的内存,占据该进程一定的内存资源,以方便下次运行使用时的快速读取
    • 时效性:一旦该进程关闭,则该进程的内存则会清空
  • 硬盘缓存:硬盘缓存则时直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢

在浏览器中,浏览器会在js和图片等文件解析执行后直接存入 内容缓存,那么当刷新页面时只需直接从内存缓存中读取


css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存

协商缓存

触发条件:

  1. Cache-Control的值为no-cache(不强缓存)
  2. 或者max-age过期
    请添加图片描述

图中,虽然强缓存命中,但是也有ETagLast-Modified,这两个就是协商缓存相关规则

Etag:服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)

If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有ETag声明,则再次向服务器请求时带上头If-None-MatchETag的值)。服务器收到请求后发送头If-None-Match则于被请求资源的相应校验串进行比对,决定是否协商缓存请添加图片描述

请添加图片描述

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

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

相关文章

【C++】二叉搜索树

前言 hi~大家好呀,欢迎点进我的C学习笔记~ 我的前一篇C笔记链接~ 【C】多态_柒海啦的博客-CSDN博客 本篇需要用到的基础二叉树C语言实现链接~ 用c语言实现一个简单的链表二叉树_柒海啦的博客-CSDN博客_c语言建立二叉树链表 我们知道,查找一个数据会有很多…

数据库基本操作

目录 数据库操作 创建数据库 查看数据库 选择数据库 删除数据库 注释 数据表操作 创建数据表 查看数据表 查看数据表 查看数据表的相关信息 修改数据表 修改数据表名称 修改表选项 查看表结构 查看数据表的字段信息 查看数据表的创建信息 查看数据表结构 修…

linux进程间通信之共享内存

目录 一,共享内存原理 二,创建共享内存 1,shmget创建共享内存 2,shmat挂接共享内存 3,shmdt取消挂接共享内存 4,shmctl删除共享内存 三,代码使用 1,com.hpp 2,ipc_client.c…

Allegro基本规则设置指导书之Physical Region

Allegro基本规则设置指导书之Physical Region 下面介绍基本规则设置指导书之Physical Region 空白的地方创建一个Region 给新建的Region匹配一个规则,所有区域里面的Physical相关的都按照Region的规则来 当部分网络想按照本身的规则来匹配,可以创建region-Class 然后匹配…

目标检测算法——医学图像开源数据集汇总(附下载链接)

关注”PandaCVer“公众号 深度学习Tricks,第一时间送达 目录 1.血细胞图像数据 2.眼病深度学习数据集 3.皮肤病数据集 4.膝关节 X 射线图像数据集 小海带整理不易,小伙伴们记得一键三连喔!!! >>>一起交流…

VisualSVN 是 Visual Studio 的专业级 Subversion 集成插件

用于 Visual Studio 的 VisualSVN 专业且无缝的 Subversion 集成。 专业级 Subversion 集成 VisualSVN 是 Visual Studio 的专业级 Subversion 集成插件。 VisualSVN 的主要优点是: 无与伦比的可靠性: Visual Studio 永远不会因为 VisualSVN 而崩溃或挂…

保护鲸鱼动物网页设计作业 静态HTML宠物主题网页作业 DW鲸鱼网站模板下载 大学生简单动物网页作品代码 个人网页制作 学生个人网页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

2022阿里云栖大会,顶尖科技趋势峰会和全链路元宇宙体验

2022年的11月3日-5日是阿里巴巴云栖大会的日子,地点在云栖小镇,本人有幸报名参加了5日那场,因为5日是周六。秉着打工人工作日需要搬砖,因为“公司离不开我”,哈哈哈,实际上是每天满满的工作量。所以只能选择…

一文彻底搞懂协程(coroutine)是什么,值得收藏

什么是协程 我们可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的。 同时,协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核&#xff0…

NYIST(计科ACMTC)第三次招新赛题解

A题 原文, 原比赛B题 牛客练习赛104【出题人题解】 - 知乎 直接输出 输入的数 就可以了 B题 C题 找到分别处理"无留陀的化身"坐标轴的x轴和y轴, 组合成无留陀的坐标, 再遍历求纳西妲的坐标, 相减即可 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿…

ROS小工具学习与使用

ROS小工具学习与使用 rqt的使用 rqt_bag工具 rqt_bag <your bagfile> #使用rqt_bag查看你的rosbag例如&#xff1a;可以查看第一帧GPS的rawdata信息&#xff0c;如下图&#xff1a; 参考文献&#xff1a; 1、http://wiki.ros.org/rqt_bag 2、rosbag与rqt_bag的常用 rq…

Nacos学习笔记

视频学习指路&#xff1a; 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 Nacos nacos注册中心的搭建 1.下载nacos的安装包&#xff0c;github地址&#xff1a;https://github.com/alibaba/nacos&…

Tkinter保姆级教程(上)

目录 什么是GUI Tkinter用法详解 第一个Tkinter程序 常用控件和属性 主窗口 Label标签控件 Button按钮控件 Entry输入控件 基本属性 Text 文本控件 列表框(ListBox)和组合框(Combobox) 单选框(Radiobutton)和多选框按钮(Checkbutton) 什么是GUI 图形用户界面&#x…

运算放大器正反馈负反馈判别法

---------------------------------------------------------------------------------------------------------------- 反馈可分为负反馈和正反馈。前者使输出起到与输入相反的作用&#xff0c;使系统输出与系统目标的误差减小&#xff0c;系统趋于稳定&#xff1b;后者使输出…

java面向对象(上)

一、java面向对象学习的三条主线1.java类以及类的成员&#xff1a;属性、方法、构造器&#xff1b;代码块、内部类。2.面向对象的三大特征&#xff1a;封装性&#xff0c;继承性&#xff0c;多态性&#xff0c;&#xff08;抽象性&#xff09;。3.其他关键字&#xff1a;this&a…

.net技术第一章

文章目录.NETC# (C Sharp)的特点C# 的应用范围.NET Framework1.2 创建简单的C#程序结构和书写规则类型的声明和使用类型的声明和使用命名空间使用方法命名空间举例注释Main方法命令行参数Main返回值控制台输入和输出例子格式化.NET 由微软公司提供的免费、跨平台的开源通用开发…

复杂分数 马蹄集

复杂分数 难度&#xff1a;白银 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 编写程序连续输入a1、a2、、a5,计算下列表达式的值并输出。本题不考虑输 入0&#xff0c;负数或者其他特殊情况。 1十1中 al 3 4 格式 输入格式&#xff1a;输入整型&#xff0c;空格分隔。…

Go语言学习(二) 函数

文章目录函数go函数基本语法go不支持重载go中支持可变参数函数 go函数基本语法 先来看看go中函数的基本使用 package mainimport "fmt"/* func 函数名(形参列表) (返回值类型列表) {执行语句..return 返回值列表 } */ //自定义函数&#xff1a;功能&#xff1a;两…

实验三:多种影响因素下购房方案的比较

根据呼文军[1]等建立的购房决策数学模型式(1)[1]&#xff0c;通过对影响购房的多个因素进行科学地分析、比较&#xff0c;从若干备选购房方案中做出最佳的选择。 QP*WT &#xff08;1&#xff09; 在文章的“实例分析”中&#xff0c;假设…

Kubeadm搭建kubernetes(k8s)集群

目录 一、集群介绍 1、集群搭建方法 二、集群部署 环境配置 所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换 node02&#xff08;192.168.137.30&#xff09; node01&#xff08;192.168.137.20&#xff09; ​编辑 master&#…