浏览器缓存之强缓存和协商缓存

news2024/9/30 9:27:57

为什么需要缓存?

- 缓存的优点:

1.减少对服务器的访问次数,减轻了服务器的压力

2.节省用户网络带宽(就是省钱,带宽都是按流量算钱的)

3.从缓存读取更匀速减少等待优化了用户体验

- 缓存的缺点

资源被缓存后用户不能及时获取不到最新的资源,所以缓存不能乱用

强缓存

涉及的http头:

1.expires: 资源的过期时间 是一个绝对时间

2.cache-control: 多个字段组合对缓存的控制 为了解决expires是绝对时间可能不准的弊端

        - max-age: 缓存生效的时间长度 单位是s 在expires上加了一个最大可用时长

        - no-cache: 设置浏览器不能直接用缓存,必须先询问服务器缓存是否有效才能使用缓存

        - no-store: 禁止缓存,只能从服务器端获取最新资源

浏览器会根据expires来判断缓存是否可用

expires和cache-control同时设置后者优先级更高

因为expires是绝对时间,客户端和服务端的时间可能会误差,客户端的时间是可以手动设置的,所以有弊端,所以才有了cache-control,它的max-age是相对时间,还能设置浏览器用不用缓存机制

协商缓存

因为强缓存是客户端处理是否读取缓存的,不会请求服务器验证缓存是否可用,只要没到expires的过期时间就会一直使用,导致服务器在expires时间内资源发生了变化客户端获取不到最新资源,于是就有了协商缓存和服务器进行协商缓存是否可用

涉及的http头:

1.last-modify/if-modified-since 文件最后修改时间

2.etag/if-none-match 文件的唯一标识 文件修改就会生成一个新的唯一标识

last-modify和etag同时设置服务器会优先验证etag,etag一致再验证last-modify,如果都一致则返回304让浏览器读缓存,否则返回最新的资源

上述的http头都是成对使用的,浏览器首次请求资源服务器响应头会返回一个last-modify或者etag,浏览器再次请求同一资源时就会在请求头中设置另一个头将其带过去给服务器验证

既生last-modify何生etag?

http1.1中的etag是解决last-modify的弊端:

- last-modify只能精确到秒级,如果一个资源的last-modify和if-modified-since在一秒内发生修改会导致时间不准缓存失效拿不到最新的资源

- 有些定期生成的文件也会导致last-modify发生变化但是文件内容并没有变化导致缓存无法复用

- 可能存在服务器没有设置准确的最后修改时间或者与代理服务器的时间不一致等情况导致缓存照样更新

浏览器加载资源过程

1.浏览器首次请求资源:

2.浏览器加载已经请求过的资源

响应头总结

1.强缓存

响应头:

cache-control: max-age: 60

expires: 过期时间

如果没过期,直接用,如果过期了, 发请求

2.协商缓存

响应头:

last-modify: 时间 最后修改时间

etag: 服务器文件的唯一标志

请求头:

if-modify-since: 上次返回的last-modify

if-none-match: 上次返回的etag

对一些周期性固定不变的数据使用强缓存,对一些变化频繁的数据使用协商缓存,协商缓存验证优先级大于强缓存

请求响应头总结

浏览器要求服务器特定行为,设置请求头

服务器要求浏览器特定行为,设置响应头

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

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

相关文章

TypeScript快速上手语法+结合vue3用法

TypeScript快速上手语法结合vue3用法 前言: 本篇内容不涉及TypeScript安装以及配置,具体安装及配置篇可以看下面目录,本篇只涉及TypeScript语法相关内容,及结合vue3的用法。不讲废话,简单直接直接开撸。 目录 Type…

理想汽车--笔试(算法)

笔试分为选择题和编程题,选择题考的很全面,包括概率论、数据库、机器学习、python、数据结构。 选择题 1.在某些规划的分类器中,依据规划质量的某种度量对规划排序,保证每一个测试记录都是由覆盖它的‘最好的’规格来分类&#…

LeetCode-54. 螺旋矩阵

题目来源 54. 螺旋矩阵 题目思路 while循环只遍历"环"&#xff0c;不成环就不遍历了 四个边界 上边界 top : 0下边界 bottom : matrix.length - 1左边界 left : 0右边界 right : matrix[0].length - 1 矩阵不一定是方阵 top < bottom && left < r…

使用git从github.com中clone一个项目的源代码---git与github的安装配置与使用入门

本文目录git简介github简介git的安装github的配置1&#xff0c;注册github帐号2&#xff0c;登录github3&#xff0c;配置git4&#xff0c;生成密钥5&#xff0c;在github中添加密钥6&#xff0c;使用git从github.com中clone一个项目的源代码git简介 Git是一个开源的版本控制管…

Java知识复习(六)常见的设计模式(单例、原型、工厂)

前言 发现无论是什么设计模式&#xff0c;其实总的原则就是减少耦合&#xff0c;增加可复用代码&#xff0c;使系统更易于扩展 参考书籍&#xff1a;《秒懂设计模式》 1、单例模式&#xff08;Singleton&#xff09; 单例模式&#xff1a;即单一的实例&#xff0c;同时提供几…

【java web篇】项目管理构建工具Maven简介以及安装配置

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

【离线数仓-8-数据仓库开发DWD层-交易域相关事实表】

离线数仓-8-数据仓库开发DWD层-交易域相关事实表离线数仓-8-数据仓库开发DWD层-交易域相关事实表一、DWD层设计要点二、交易域相关事实表1.交易域加购事务事实表1.加购事务事实表 前期梳理2.加购事务事实表 DDL表设计分析3.加购事务事实表 加载数据分析1.首日全量加购的数据加载…

基于APRX并行架构的高速QPSK解调实现(Matlab仿真篇)

由于QPSK系统下变频之后的信号中频为720MHz,信息符号速率为500Mbps,因此,采用传统的串行解调方案已无法在FPGA中实现解调。因此,本方案采用基于APRX并行架构实现对高速率的QPSK解调。如图1所示,为并行全数字QPSK接收机实现架构。 图1 并行全数字QPSK接收机实现架构 1 高速…

Golang 接口笔记

基本介绍接口是一个数据类型&#xff0c;可以定义一组方法&#xff0c;但都不需要实现。并且interface中不能包含任何变量。到某个自定义类型要使用的时候&#xff0c;再根据具体情况把这些方法实现出来语法type 接口名 interface {method1(参数列表) 返回值列表method2(参数列…

UG NX二次开发(C#)-CAM-点击插件自动进入CAM模块

文章目录 1、前言2、调用CAM模块错误2、进入加工模块1、前言 UG NX软件中CAM模块作为一个很重要的,也是其特别亮点的功能模块,能实现车、铣、磨、钻等加工工艺编程,但是由于其是通用性比较强,对于专业上的可能不能完全满足要求,这就要求我们在CAM模块下进行二次开发。我们…

操作系统核心知识点整理--进程篇

操作系统核心知识点整理--进程篇什么是系统调用进程篇什么是进程什么是线程从一次fork调用看linux进程和线程的本质区别小结用户级线程和内核级线程的区别进程的状态进程的切换进程调度并发问题死锁参考本文主要面向应用层软件开发人员整理一篇必须了解的操作系统核心知识图谱&…

maya多边形顶点变形批量传递方法

一、问题描述 做项目时&#xff0c;对于重复更改相同模型的顶点位置需要大量重复操作&#xff0c;maya默认提供了多边形属性传递的方法&#xff0c;如下图&#xff1a; 但一次只能执行一次&#xff0c;并且带有大量历史节点&#xff0c;此方式的好处是&#xff0c;可以实现实…

《零成本实现Web自动化测试--基于Selenium》 Selenium-RC

一. 简介 Selenium-RC可以适应更复杂的自动化测试需求&#xff0c;而不仅仅是简单的浏览器操作和线性执行。Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例&#xff0c;例如读写文件、查询数据库和E-mail邮寄测试报告。 当测试案例遇到selenium-IDE不支持的逻辑…

python的所有知识点+代码+注释,不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类&#xff0c;注&#xff1a;不是那个对象&#xff01;&#xff01;&#xff01;&#xff01;&…

HTML创意动画代码

目录1、动态气泡背景2、创意文字3、旋转立方体1、动态气泡背景 <!DOCTYPE html> <html> <head><title>Bubble Background</title><style>body {margin: 0;padding: 0;height: 100vh;background: #222;display: flex;flex-direction: colum…

SpringCloud————Eureka概述及单机注册中心搭建

Spring Cloud Eureka是Netflix开发的注册发现组件&#xff0c;本身是一个基于REST的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka组件的三个角色 服务中心服务提供者服务消费者 Eureka Server&#xff1a;服务器端。提供服务的注册和发现…

kubernetes 1.26.1 Etcd部署(外接)保姆级教程

目录 部署etcd前期准备 机器信息 升级内核 系统配置 部署容器运行时Containerd 安装crictl客户端命令 配置服务器支持开启ipvs的前提条件 安装 kubeadm、kubelet 和 kubectl 安装部署etcd 1.将 kubelet 配置为 etcd 的服务管理器 2.为 kubeadm 创建配置文件 3. 生成…

2023年网络安全某市赛竞赛任务书

竞赛任务书 一、竞赛时间 共计3小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 数据库服务渗透测试 100分钟 150 任务二 Windows操作系统渗透测试 200 任务三 Linux操作系统渗透测试 150 任务四 Web安…

【人工智能 AI】什么是人工智能? What is Artificial Intelligence

目录 Introduction to Artificial Intelligence人工智能概论 What is Artificial Intelligence? 什么是人工智能?

ProtoBuf介绍

1 编码和解码编写网络应用程序时&#xff0c;因为数据在网络传输的都是二进制字节码数据&#xff0c;在发送数据时进行编码&#xff0c;在接受数据时进行解码codec&#xff08;编码器&#xff09;的组成部分有2个&#xff1a;decoder&#xff08;解码器&#xff09;和encoder&a…