最强Http缓存策略之强缓存和协商缓存的详解与应用实例

news2024/11/15 13:02:47

HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。

一. 强缓存

强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。
常见的强缓存响应头如下所述:

  1. Cache-Control
    Cache-Control 响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:
  • max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Cache-Control: max-age=31536000(代表该资源在本地缓存中一年内有效)。
  • no-cache:代表该资源需要进行缓存,但是在使用前需要向服务器发送请求,以此让服务器根据 If-Modified-Since 或 If-None-Match 判断该资源是否更新,以此决定是否使用本地缓存。
  • no-store:代表禁止使用任何形式的缓存,每次请求都需要重新向服务器发送请求。
    例如,下面是一个 Cache-Control 响应头的示例:
    Cache-Control: public, max-age=31536000
    其中,public 表示该资源在客户端和代理服务器中均可以缓存,max-age=31536000 表示该资源在本地缓存中一年内有效。
  1. Expires
    Expires 响应头在 HTTP / 1.0 中被广泛使用,用于指定资源的到期时间,以确保浏览器不会在过期日期之后再次发送请求。
    例如,下面是一个 Expires 响应头的示例:
    Expires: Tue, 30 Dec 2030 12:00:00 GMT
    其中,Expires 表示该资源的到期时间为 Tue, 30 Dec 2030 12:00:00 GMT。

二. 协商缓存

协商缓存是指在使用缓存之前,浏览器需要向服务器发起网络请求,以此根据服务器返回的响应头中的 ETag 或 Last-Modified 字段来判断该资源是否更新,进而决定是否使用本地缓存。
常见的协商缓存响应头如下所述:

  1. ETag
    ETag 是一个 Web 服务器为每个资源分配的唯一标识符,用于判断该资源是否更新。例如,下面是一个 ETag 响应头的示例:
    ETag: “123456789”
    其中,“123456789” 是该资源的唯一标识符。
  2. Last-Modified
    Last-Modified 是资源在服务器上最后被修改的时间戳,也用于协商缓存。例如,下面是一个 Last-Modified 响应头的示例:
    Last-Modified: Fri, 01 Jan 2021 00:00:00 GMT
    在协商缓存中,浏览器请求服务器时,会在请求头中添加 If-None-Match(代表当前本地缓存中资源的 ETag 值)和 If-Modified-Since(代表当前本地缓存中资源的 Last-Modified 时间戳)字段,告诉服务器自己本地缓存的该资源的 ETag 和 Last-Modified 时间戳。服务器收到请求后,会根据请求头中的这些字段和资源的当前 ETag 和 Last-Modified 时间戳,来判断该资源是否更新。
    如果资源未更新,则服务器返回 304 Not Modified 响应码,表示不需要重新下载资源,可以直接使用本地缓存。如果资源已更新,则服务器返回新的资源,并更新浏览器的本地缓存。

三. 示例

下面通过一个实际的案例来展示 HTTP 缓存的具体应用。假设有一个服务器上的图片资源,其地址为 https://example.com/img/logo.png,其相关信息如下:

  • 大小:10KB
  • 修改时间:2021/05/20 10:10:10
  • ETag:“123456”
  • 缓存策略:Cache-Control: max-age=3600
    当浏览器首次发起请求时,服务器会将响应头中的 Cache-Control 和 ETag 值返回给浏览器,如下所示:
HTTP/1.1 200 OK
Cache-Control: max-age=3600
ETag: "123456"
Content-Length: 10240
Content-Type: image/png
 <binary image data...>

浏览器接收到响应头中的相关信息后,将资源保存到本地缓存中。当浏览器再次请求这个资源时,浏览器会先检查本地缓存中是否有该资源的缓存条目,如果有,则会直接返回本地缓存中的数据;如果没有,则会向服务器发起请求。
浏览器在发起请求时,会将 If-None-Match 和 If-Modified-Since 字段添加到请求头中,告诉服务器自己本地缓存的该资源的 ETag 和 Last-Modified 时间戳,如下所示:

GET /img/logo.png HTTP/1.1
Host: example.com
If-None-Match: "123456"
If-Modified-Since: Thu, 20 May 2021 10:10:10 GMT

服务器接收到请求后,会根据请求头中的 If-None-Match 和 If-Modified-Since 字段和资源的当前 ETag 和 Last-Modified 时间戳,来判断该资源是否更新。如果资源未更新,则服务器返回 304 Not Modified 响应码,表示不需要重新下载资源,可以直接使用本地缓存。如果资源已更新,则服务器返回新的资源,并更新浏览器的本地缓存。
在这里插入图片描述

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

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

相关文章

javaweb权限管理简单实现_javaweb管理系统项目

最近在做一个网站类型项目&#xff0c;主要负责后台&#xff0c;ui框架选型为jquery easy ui&#xff0c;项目架构为spring mvc spring jdbc&#xff0c;简单易用好上手&#xff01;搭建好框架后开始了第一个任务&#xff0c;设计并实现一套简单的权限管理功能。 一套最基本的…

深度学习第J8周:Inception v1算法实战与解析

目录 一、Inception v1 1.简介 2. 算法结构 二、pytorch代码复现1.前期准备 2.代码复现 3.训练运行 3.2指定图片进行预测 三、总结 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作…

ChatGPT登陆方法及常见问题

Chatgpt现在推出ChatGPT Plus服务&#xff0c;所以对注册账号限制比较大 Plus账号有什么优势&#xff1f; 我们可以看到官方介绍&#xff1a; 优势1 Available even when demand is high 当访问量大时&#xff0c;依旧可以访问 优势2 Faster response speed 更快的回复速度…

无云服务器,Linux本地快速搭建web网站,并内网穿透发布上线

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 转载自cpolar文章&#xff1a;Linux CentOS本地搭建…

医疗器械的分类与查询

我国根据医疗器械产品安全性对医疗器械进行分类管理。分类目录由国家食品药品监督管理部门依据医疗器械分类规则制定&#xff1a; 第一类是风险程度低&#xff0c;实行常规管理可以保证其安全、有效的医疗器械。如&#xff1a;外科用手术器械&#xff08;刀、剪、钳、镊、钩&a…

RabbitMQ 工作队列模式 Work Queue Demo

工作队列模式,一个消息只能有一个消费者消费 生产者发送20条消息 消费者有两个 第一个消费 睡一秒取一个 第二个睡2秒取 public class WorkConsumerTest1 {public static void main(String[] args) throws IOException, TimeoutException {//1 创建连接工厂ConnectionFactor…

「华熙生物」发来感谢信,企企通赋能生物科技领域数字化采购建设

近日&#xff0c;华熙生物科技股份有限公司&#xff08;以下简称“华熙生物”&#xff09;携手企企通打造的数字化采购管理平台成功上线。为感谢企企通在采购数字化项目上的付出和努力&#xff0c;华熙生物特意发来暖心感谢信。 在感谢信中&#xff0c;华熙生物表示&#xff1a…

【目标检测实验系列】YOLOv5改进实验:结合VariFocal Loss损失函数,减少小目标漏检问题,高效提升模型检测的召回率(超详细改进代码流程)

目录 1. 文章主要内容2. VariFocal Loss损失函数&#xff08;原理&#xff1a;简单介绍&#xff0c;可自行详细研究&#xff09;2.1 VariFocal Loss损失函数2.2 博主数据集实验效果 3. 代码详细改进流程(重要)3.1 新建varifocalLoss.py文件3.2 修改hyp.scratch-low.yaml文件3.3…

【MATLAB图像处理实用案例详解(20)】——利用BP神经网络实现人脸朝向判断

目录 一、问题描述二、算法步骤2.1 读入数据并提取特征2.2 创建神经网络并训练2.3 测试 三、结果分析 一、问题描述 BP神经网络利用输出后的误差来估计输出层的直接前导层的误差&#xff0c;再用这个误差估计更前一层的误差&#xff0c;如此一层一层的反传下去&#xff0c;就获…

4_用dockerfile制作镜像

Docker 镜像原理 思考&#xff1a; Docker 镜像本质是什么&#xff1f; Docker 中一个centos镜像为什么只有200MB&#xff0c;而一个centos操作系统的iso文件要几个个G&#xff1f; Docker 中一个tomcat镜像为什么有500MB&#xff0c;而一个tomcat安装包只有70多MB&#xff…

JavaScript中的Concurrency并发:异步操作下的汉堡制作示例

这篇文章想讲一下JavaScript中同步与异步操作在一个简单的示例中的应用。我们将以制作汉堡为例&#xff0c;展示如何使用同步方法、回调函数&#xff08;callbacks&#xff09;和Promise与async/await来实现该过程。 Let’s imagine we’re trying to make a burger: 1. Get …

基于simulink使用混合波束成形对射频毫米波发射器进行建模

一、前言 本例说明了一种使用66元件混合波束成形天线对32 GHz QPSK射频发射和接收系统进行系统级建模和仿真的方法。该系统包括射频缺陷、发射阵列辐射效应、窄带接收阵列和基带接收器&#xff0c;可校正系统损伤和消息解码。天线波束形成方向使用方位角和仰角定义&#xff0c;…

C语言CRC-16 USB格式校验函数

C语言CRC-16 USB格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同应用规范通过对输…

计算机图形辐照度学、光度学

文章目录 前言&#xff1a;一、什么是辐照度学二、什么是光度学 前言&#xff1a; 在计算机图形学中是把辐射(Radiance)等概念和亮度(Luminance)等概念不做区分的。辐射是辐照度学的概念&#xff0c;而亮度则是光度学上的概念。 辐照强高度并不意味着亮度就强&#xff0c;就比如…

VTK 几何体连通区域分析 vtkPolyDataConnectivityFilter

前言&#xff1a; vtkPolyDataConnectivityFilter 使用过&#xff0c;但网上没有看到完事的教程&#xff1b;这里整理一下&#xff1b; 提取数据集中连通的多边形数据。 该类是一个滤波器&#xff0c;提取cell&#xff08;区域&#xff09; - 拥有公共点或者满足某个阈值 该类…

Soft-RoCE部署及通信测试

Soft-RoCE部署及通信测试 Soft-RoCE是一种基于软件的RoCE&#xff08;RDMA over Converged Ethernet&#xff09;实现。RoCE是一种在以太网上实现RDMA&#xff08;Remote Direct Memory Access&#xff09;的技术&#xff0c;它允许数据在网络中直接传输&#xff0c;而无需CPU…

【ElasticSearch】几点优化及面试相关

文章目录 硬件选择分片策略合理设置分片数推迟分片分配 路由选择写入速度优化(磁盘优化)批量数据提交优化存储设备合理使用合并减少 Refresh 的次数加大 Flush 设置减少副本的数量 内存设置ES配置文件解析Elasticsearch 面试题为什么要使用 Elasticsearch?Elasticsearch 的 ma…

【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

​ 哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 本期为大家带来的是网络编程的 UDP Socket 套接字&#xff0c;基于 UDP协议的 Socket 实现客户端服务器通信&#xff0c;Socket 套接字可以理解为是&#xff0c;传输层给应用层提供的一组 API&#xff0c;…

Java中提升接口性能的一些方法

目录 1.使用线程池并行执行2.数据库优化2.1 小表关联大表2.2 反三大范式操作2.3 增加索引2.4 减小事务粒度2.5 读写分离、分库分表 3.拥抱缓存3.1 Redis3.2 内存缓存 4.锁和异步4.1 减小锁的粒度4.2 分布式锁 1.使用线程池并行执行 假如有一个接口的逻辑如下&#xff1a; 接口…

cadence遇到的问题

1、最烦人的&#xff0c;突然卡住。 设置grid卡住&#xff0c;导出libraries卡住&#xff0c;选择其他产品时卡住。 从微软拼音输入法改成美式键盘后能解决一些问题。但不能解决全部。 今天下载了搜狗输入法来替代微软自带输入法。效果奇佳&#xff0c;真的可以诶。 2、如果…