(十三)强缓存和协商缓存的区别
一、浏览器的缓存策略
浏览器的缓存策略是指浏览器在加载页面时如何使用和管理缓存机制。可以提高网页加载速度,减轻服务器负载,并提供更好的用户体验。常用的缓存策略有两种:一种是发送请求(协商缓存),一种是不需要发送请求(强缓存)。
强缓存:
当浏览器第一次发送请求后,服务器会返回缓存标识,在http1.0使用expires,http/1.1时是cache-control。当浏览器需要使用资源的时候,会去查看文件缓存标识是否过期,如果没有过期就从缓存中获取资源。
expires:规定一个缓存失效时间,过了这个时间,浏览器就需要重新发送请求获取资源。缺陷:浏览器和服务器的时间可能存在误差。
cache-control:规定一个,max-age(有效时长),即服务器返回后资源可以使用,max-age时长。
cache-control值包括:
- public:表示响应可以被任何对象(包括浏览器和CDN等)缓存
- private:只能被浏览器缓存,不能被CDN等其他对象缓存
- no-cache:浏览器使用缓存前必须向服务器发送请求验证
- no-store:表示不缓存任何响应内容。
expires和cache-control同时存在浏览器优先使用cache-control。
缓存过期策略:
通过设置响应头中的Expires或Cache-Control字段,可以指定资源的过期时间。当资源过期时,浏览器会重新发送请求到服务器获取最新资源。
协商缓存:
当强缓存失效时,浏览器会发送一个请求到服务器,服务器会根据请求头中携带tag(last-modified。和Etag)与服务器上资源的资源的相关字段进行比较。如果资源未发生变化,则服务器返回304状态码,告诉浏览器可以使用本地缓存。
缓存位置:
- memory cache:内存缓存是所有缓存运行速度最快的,到那时内存小,保存时间短。
- disk cache:磁盘缓存,内存较大,效率比内存缓存低。
- service worker cache:运行于浏览器背后,独立于网页,有自己的生命周期。可操作性高,开发人员可以控制缓存内容,例如控制仅缓存离线内容或者全部缓存。在离线情况还可以去读取缓存的资源。
- disk cache:http2的内容,需要浏览器和服务器都支持,可以提前与缓存。缓存即将可能用到的数据,服务器不再等待浏览器请求,可以主动通过http2发送数据,极大地提高了网页运行速度性能。
强缓存和协商缓存的区别:
1. 数据来源与交互方式
强缓存:
在缓存的有效期内在 本地缓存 拿数据,即浏览器与服务器之间不会有交互。
协商缓存:
每次请求都会与浏览器进行交互。浏览器会向服务器发送请求,询问资源是否有更新,服务器根据请求中的某些标识(ETag或Last-Modified)来判断资源是否发生变化,并做出响应。
2. 响应状态码:
强缓存:
如果命中强缓存,浏览器会直接读取本地缓存,而不会向服务器发请求。强缓存状态码为200(OK)
协商缓存:
如果资源未发生变化,服务器会返回304(Not MOdidied)状态码,表示浏览器可以根据使用本地缓存的数据。如果有更新,则会返回新的数据。
3. 缓存验证机制
强缓存:
通过 Expires和Cache-Control这两个HTTP请求头信息实现,指定缓存的有效期。在有效期内,浏览器不会向服务器发请求
协商缓存:
通过ETag和Last-Modified这两个请求头实现。ETag是一个资源的唯一标识,Last-Modified表示资源最后的修改时间。浏览器在请求时会带上这两个信息,服务器会根据这些信息来判断资源是否发生了变化。
4. 刷新策略
f5刷新网页时,跳过强缓存,进行协商缓存
ctrl+f5刷新页面时会跳过强缓存和协商缓存,直接向服务器请求
总结
| 缓存类型 | 获取资源形式 | 状态码 | 发送请求到服务器 |
|---|---|---|---|
| 强缓存 | 从本地缓存 | 200(from cache) | 否,直接从缓存取 |
| 协商缓存 | 从缓存取 | 304(Not Modified) | 否,通过服务器来告知缓存是否可用 |
参考:
https://blog.csdn.net/qq_63140280/article/details/131396490?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171263296216800184140665%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171263296216800184140665&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-131396490-null-null.142v100pc_search_result_base1&utm_term=%E6%B5%8F%E8%A7%88%E5%99%A8%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5&spm=1018.2226.3001.4187
https://blog.csdn.net/weixin_45822171/article/details/136850590
https://blog.csdn.net/m0_48076809/article/details/119304747
相关文章:
(十三)强缓存和协商缓存的区别
一、浏览器的缓存策略 浏览器的缓存策略是指浏览器在加载页面时如何使用和管理缓存机制。可以提高网页加载速度,减轻服务器负载,并提供更好的用户体验。常用的缓存策略有两种:一种是发送请求(协商缓存),一…...
如何创建Windows下google Chrome便携版?
创建google Chrome便携版教程 准备工作: 1,下载GoogleChromePortable启动器 2,下载谷歌浏览器 3,下载7-ZIP 解压提取器 用7zip解压GoogleChromePortable,得到GoogleChromePortable.exe启动器 解压谷歌浏览器 用7…...
rabbitmq安装rabbitmq-delayed-message-exchange插件
下载地址:Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…...
B02、分析GC日志-6.3
1、相关GC日志参数 -verbose:gc 输出gc日志信息,默认输出到标准输出-XX:PrintGC 输出GC日志。类似:-verbose:gc-XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志, 并在进程退出时输出当前内存各区域分配情况-XX:PrintGCTimeStamp…...
Redis中的集群(二)
节点 集群数据结构 redisClient结构和clusterLink结构的相同和不同之处 redisClient结构和clusterLink结构都有自己的套接字描述符和输入、输出缓冲区,这两个结构的区别在于,redisClient结构中的套接字和缓冲区是用于连接客户端的,而clust…...
UVA12538 Version Controlled IDE 题解 crope
Version Controlled IDE 传送门 题面翻译 维护一种数据结构,资磁三种操作。 1.在p位置插入一个字符串s 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 1 ≤ n ≤ 50000 1 \leq n \leq 50000 1≤n≤50000,所…...
OAuth2.0客户端和服务端Java实现
oauth2 引言 读了《设计模式之美》和《凤凰架构》架构安全篇之后,决定写一个OAuth2.0的认证流程的Demo,也算是一个阶段性的总结,具体原理实现见《凤凰架构》(架构安全设计篇)。 涉及到的源码可以从https://github.com/WeiXiao-Hyy/oauth2获…...
物流自动分拣系统激光雷达漫反射板
早在二十世纪六十年代,激光器的诞生为激光雷达技术的发展奠定了基础。随后,激光雷达技术开始应用于各种领域,包括军事、航空、地理勘测等。然而,在物流自动分拣领域,激光雷达的应用相对较晚。 随着物流行业的快速发展和…...
2024 抖音欢笑中国年(三):编辑器技巧与实践
前言 本次春节活动中,我们大部分场景使用内部的 SAR Creator互动方案来实现。 SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案,目前支持了Web和字节内部跨端框架平台,服务于字节内部的各种互动业务,包括但不限…...
Python学习入门(1)——基础语句(二)
14. 迭代器和迭代协议 在Python中,迭代器是支持迭代操作的对象,即它们可以一次返回其成员中的一个。任何实现了 __iter__() 和 __next__() 方法的对象都是迭代器。 class Count:def __init__(self, low, high):self.current lowself.high highdef __i…...
vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示
vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示(考勤打卡) 一、创建百度地图账号,获取秘钥二、 引入插件1、安装vue-baidu-map2、在main.js中引入 三、 简单使用 最近写项目的时候,做到了考勤打卡的模块内容&#x…...
使用idea运行程序,发现控制台的中文出现乱码
修改UTF-8发现没有效果,寻找.idea文件夹的encodings.xml文件,将里面的UTF-8全部变成GBK....
基于javassm实现的大学生兼职信息系统
开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…...
O2OA开发平台如何查看数据表结构?
在访问后端api地址,页面最下方有列示平台的各个服务,点击进入可查看具体的表内容 后端api地址: http://{hostIP}/x_program_center/jest/list.html 其中:{hostIP}为中心服务器所在域名或者IP地址 如下图:...
心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发
心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发 支持SAAS、支持独立加密、支持独立开源、价格不同。 自带题库数据,后台一键初始,支持自己上传题目 心理测评 微信公众号微信小程序抖音小程序可打包APP 支持单题、跳跃题、计分题、因子题、…...
【蓝桥杯】十六进制转八进制 C++实现
1.题目信息 时间限制:1.0s 内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1<n<10)。 接下来n行,每行一个由09、大写字母AF组成…...
明明设置数字居中对齐,为什么excel的数字却不居中?
有时候在excel里,选中数据,设置对齐方式 左右居中,然而,数字却怎么都不居中,为什么呢? 1.按快捷键Ctrl1,打开单元格自定义格式对话框,看到是初始界面是在数字的会计专用,…...
深入解析API技术:原理、实现与应用
在现代软件开发中,API(应用程序接口)扮演着至关重要的角色。API 允许不同的软件应用程序和系统之间进行通信和数据交换,从而构建出更加高效、灵活和可扩展的软件解决方案。本文将深入解析API技术的原理、实现方法,并附…...
C语言——数组指针变量
一、什么是数组指针 数组指针变量是指向数组的指针,它可以用来遍历数组元素、进行数组操作以及作为函数参数传递数组等操作。在C语言中,数组名本身就是数组的首地址,因此数组指针可以指向数组的首地址。 数组指针变量的基本形式:…...
Redis的过期策略与内存淘汰机制原理及实践
Redis作为高性能的键值存储系统,其对数据过期与内存管理的设计直接影响到系统的性能与资源利用率。本文将以生动的比喻、通俗的语言,深入剖析Redis的过期策略与内存淘汰原理,助您全面理解数据在Redis中的生命周期管理艺术。 一、Redis过期策…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
