浏览器缓存策略:强缓存和协商缓存

浏览器缓存:其实就是在本地使用的计算机中开辟一个内存区,同时也开辟一个硬盘区,作为数据传输的缓冲区,然后利用这个缓冲区来暂时保护用户以前访问的信息
	通常浏览器的缓存策略分为两种:强缓存和协商缓存,强缓存和协商缓存都是通过设置http header来实现,从客户端读取资源,区别在于是否发生请求

强缓存

浏览器在浏览器加载资源的时候,先检查一下缓存时间时间是否过期,如果没有那么久直接从缓存直接查找器请求结果,如果缓存时间过期或者不存在,则向服务器发送请求
参数:
1.expires:过期时间,如果浏览器在该时间内再次加载资源,则命中缓存
2.cache-control:值设置为max-age:n(s),单位是s,在这个资源第一次请求并正确返回的时间的n秒内再次加载资源,则命中缓存
如果cache-control设置为no-cache则不使用本地缓存,需要使用协商缓存
cache-contro:no-store:禁止使用浏览器缓存数据,每次都会向服务器发送请求,下载完整数据
⚠️:expires优先级比cache-control要低
强缓存和协商缓存都是通过设置http header来实现,最直接的区别在于是否发送请求,简单来说,强缓存不会,只会根据设置事件判断缓存是否到期,不到期就直接拿缓存,哪怕这个时候内容已经发生变化,协商缓存每次都会向服务器发送请求来判断是否使用缓存,详细来说又一些参数。

协商缓存

不指定缓存的有效时间,而是直接发送请求到服务器判断是否可以继续使用缓存,服务器会根据这个请求的 request header的一些参数来判断,是否命中协商缓存,如果命中只有返回304状态码,并带上新的response header通知浏览器从缓存中读取资源,协商缓存可以解决,当内容发生改变,但是强缓存情况下并不更新的问题。
参数:
必须设置:cache-control:no-cache
1.last-Modify/if-Modify-since:浏览器第一次请求资源的时候,服务器会在返回的header中加上 last-Modify,这是一个时间标识该资源最后一次修改时间(单位为s),当浏览器再次请求该资源,会将服务器返回的last-Modify的值以if-Modify-since字段上送,服务器收到后,会根据资源最后修改时间判断是否命中缓存
该参数有个问题,就是如果在1s内进行改动是察觉不出来的,所以可能会造成问题
Etag/if-None-Match:这个是一个hash值,由服务器生成,当web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识,再次请求资源并发现有Etag声明,在向web服务器请求时会上送if-None-Match参数里面是Etag值与相应检验串进行比较,决定是否命中协商缓存
当然这种用法解决了上个1s内多次修改察觉不到的问题,但是Etag需要服务器通过计算生成一个hash值,所以会更消耗性能。综上第二种更好一些也更常用。

浏览器缓存过程
1.浏览器第一次请求资源,服务器返回200,浏览器将资源从服务器上下载下来,并把response header及该请求时间一起缓存
2.下一次请求的时候,会先比较当前时间和上次一请求200的时间差,如果没有超过cache-control:max-age设置的时间差,则命中缓存,不发送请求直接直接读取本地缓存,如果过期则向服务器发送header并带有if-None-Match和if-Modify-since的请求
3.服务器收到请求后,会优先根据Etag值判断请求的文件有没有做修改,如果一致则命中缓存,返回304,如果不一致则有改动,返回新的资源文件并带上新的Etag并返回200
4.如果服务器没有收到请求的Etag值,则将if-Modify-since和文件被修改的最后时间比对,一致则命中缓存并返回304,不一致则返回最后一次修改时间 last-Modify和文件并返回200
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零基础学java——【基础语法】基本输入、输出语句,变量,运算符

目录 变量 数据类型 基本数据类型一览表 声明和初始化 基本的输出、输出语句 输出语句 补充“”的使用 输入语句Scanner 使用步骤 代码演示 运算符 有些内容可能会与c语言作比较 内容借鉴了韩顺平老师的java课堂笔记(b站课) 变量 数据类型 基本…

CKA证书题库-总结

CKA真题(考题总结) 文章目录 CKA真题(考题总结)证书个人考试总结申诉结果 CKA题目参考博主重点介绍 CKA模拟题库 注意事项考试概要考试注意事项: CKA题目答案设置自动补全方法一方法二 第⼀题:权限控制RBAC…

【4. ROS的主要通讯方式:Topic话题与Message消息】

【4. ROS的主要通讯方式:Topic话题与Message消息】 1. 前言1.1 王者解释结点通讯:1.2 通讯小结 2. 灵活的Topic话题图解2.1 话题注意细节2.2 外延补充 3. Message消息图解3.1 消息类型3.2 查看标准消息类型std_msgs 4. 使用C实现Publisher发布者4.1 发布…

Sametime 12.0.1 FP1发布以及Notes中的SwiftFile使用

大家好,才是真的好。 上周,HCL推出了Sametime 12.0.1FP1FP1更新包程序,包含不少新功能以及很多修复程序。虽然Sametime组件现在不需要运行在Domino服务器上,但毕竟Sametime通常会使用Domino目录或Domino中的LDAP目录服务&#xf…

Maven 如何下载依赖包的源码包

使用Maven下载依赖包的时候, 默认是不会下载源码包的,但是有时候, 需要Debug代码,或是看看依赖项的源码的写法, 就需要下载源码包了。 这里以 Apache 的 commons-text 为例, 在Maven中添加如下依赖配置&am…

HCIA-RS实验-ENSP设备的基础配置

本文主要简单地介绍ENSP设备的基础配置,帮助读者快速上手使用ENSP。可以掌握一些基础的配置方案,更改名称,系统时间,系统地区、密码登录等信息 以下是该文章的拓扑图;现将这2台设备启动;后续双击即可进入命…

Openswan安装和简单配置

Openswan安装和简单配置 安装环境: 操作系统:Ubuntu20.0.4TLS 用户权限:root下载Openswan: wget https://github.com/xelerance/Openswan/archive/refs/tags/v3.0.0.zip安装Openswan: 解压Openswan:(PS&#xff1a…

Arduino学习笔记4

一.声控灯实验 1.源代码 int led2;//定义板子上数字2口控制小灯 int flag0;//定义一个变量记录小灯是亮起还是熄灭 int shengyin3;//定义声音传感器的控制口void setup() {pinMode(led,OUTPUT);//定义小灯为输出模式pinMode(shengyin,INPUT);//定义声音控制口为输入模式 } vo…

基于天牛须(BAS)与NSGA-Ⅱ混合算法的交直流混合微电网多场景多目标优化调度(Matlab代码实现)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

SentiBank Dector上手指南

​ 官网链接:https://www.ee.columbia.edu/ln/dvmm/vso/download/sentibank.html SentiBank Detector可以抽取图片中的形容词-名词对,之前一直看到,这次复现模型才第一次用到,上手的时候有点手足无措,因为官网在如何使…

Python入门教程+项目实战-11.4节: 元组与列表的区别

目录 11.4.1 元组与列表的区别 11.4.2 可变数据类型 11.4.3 元组与列表的区别 11.4.4 知识要点 11.4.5 系统学习python 11.4.1 不可变数据类型 不可变数据类型是指不可以对该数据类型进行修改,即只读的数据类型。迄今为止学过的不可变数据类型有字符串&#x…

我做了个GPT3键盘,用了两个月发现它有点傻

自 ChatGPT 出世,各类文本类AI产品层出不穷。甚至接连几日,Producthunt 上新品过半都是AI相关。 这其中部分原因是 OpenAI 公司开放的 GPT3 1API 接口十分易用。只要一个简单的文本请求,就能将现有产品加入AI功能。例如,Notion、…

提取文本的摘要snownlp模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 提取文本的摘要 snownlp模块 [太阳]选择题 关于以下python代码说法错误的一项是? from snownlp import SnowNLP myText """ChatGPT的出现标志着人类科技发…

【flask】三种路由和各自的比较配置文件所有的字母必须大写if __name__的作用核心对象循环引用的几种解决方式--难Flask的经典错误上下文管理器

三种路由 方法1:装饰器 python C#, java 都可以用这种方式 from flask import Flask app Flask(__name__)app.route(/hello) def hello():return Hello world!app.run(debugTrue)方法2: 注册路由 php python from flask import Flask app Flask(__name__)//app…

【JavaWeb】jQuery(上)

本章内容 1.jQuery Hello world 2.jQuery 选择器 3.jQuery 过滤器 4.jQuery 元素筛选 1、jQuery 介绍 什么是 jQuery ? jQuery,顾名思义,也就是 JavaScript 和查询(Query),它就是辅助 JavaScript 开发的 js 类…

Linux 文件内容相关命令使用汇总

Linux操作系统有很多强大的文件内容相关命令,这些命令可以让您查看、分析和编辑文件。其中,最基本和常用的命令包括cat、more、less和head/tail等。除了这些基本命令之外,grep和find命令也是文件搜索和过滤方面的有力工具。 前言 我们这篇主…

根据 vue-grid-layout 动态设置Echarts尺寸大小

文章目录 前言一、vue-grid-layout 是什么?二、正文1.引入vue-grid-layout2.myEcharts组件3. Utils中的debounce防抖函数 总结 前言 此文背景是根据 vue-grid-layout 动态拖拽组件大小里面包含 Echarts 组件情景,也可以单独把监听动态设置Echarts 尺寸抽…

【神经网络】tensorflow实验7--回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法 ②掌握多元线性回归模型的实现方法 ③掌握三维数据可视化方法 2. 实验内容 ①使用TensorFlow建立一元线性回归模型,使用商品房销售数据训练模型,并使用训练好的模型预测房价 ②使用TensorFlow建立多元线…

企业级VUE前端项目各目录文件的作用

概述 本文项目是基于Vue CLI3构建工具(基于 webpack)生成的脚手架项目。Vue CLI 现已处于维护模式,VUE官方推荐使用 create-vue(基于 Vite)构建工具。 vue-cli2.0与3.0在目录结构方面,有明显的不同,vue-cli3.0移除了…

什么是 MVVM?MVVM和 MVC 有什么区别?什么又是 MVP ?

目录标题 一、什么是MVVM?二、MVC是什么?三、MVVM和MVC的区别?四、什么是MVP? 一、什么是MVVM? MVVM是 Model-View-ViewModel的缩写,即模型-视图-视图模型。MVVM 是一种设计思想。 模型(Model…