客户端Web资源缓存

为了提高Web服务器的性能,其中的一种可以提高Web服务器性能的方法就是采用缓存技术。

1.缓存

1.1.什么是缓存?

如果某个资源的计算耗时或耗资源,则执行一次并存储结果。当有人随后请求该资源时,返回存储的结果,而不是再次计算。

1.2.新鲜度和陈旧度

问题的关键在于“计算”不是数学计算。在数学中,计算的结果随时间而变化。在网络上,您昨天请求的资源可能与您今天请求的资源不同。因此就会有新鲜度和陈旧度两个关键概念。

A fresh response is one whose age has not yet exceeded its freshness lifetime. Conversely, a stale response is one where it has.
A response’s freshness lifetime is the length of time between its generation by the origin server and its expiration time. An explicit expiration time is the time at which the origin server intends that a stored response can no longer be used by a Cache without further validation, whereas a heuristic expiration time is assigned by a Cache when no explicit expiration time is available. A response’s age is the time that has passed since it was generated by, or successfully validated with, the origin server.
When a response is “fresh” in the cache, it can be used to satisfy subsequent requests without contacting the origin server, thereby improving efficiency.
— RFC 7234 - 4.2. Freshness

2.如何进行客户端Web资源缓存?

2.1.以前的方法

万维网刚开始时相对简单。客户端会发送请求,服务器会返回所请求的资源。当资源是页面时,它是静态页面还是服务器呈现的页面并不重要。因此,早期的客户端缓存相当简单。

2.2.现在的方法

2.2.1.Web资源缓存规范

Web 缓存的第一个规范于 2014 年在RFC 7234(又名HTTP/1.1 缓存)中定义。请注意,自 2022 年起,它已被RFC 9111取代。

2.2.2.具体的方法

2.2.2.1.Pragma HTTP 标头

已经弃用

2.2.2.2.Expire HTTP 响应标头

最直接的缓存管理是通过Expire响应标头。当服务器返回资源时,它会指定缓存在哪个时间戳之后过期。请求缓存资源时,浏览器有两个选项:

  • 当前时间在到期时间戳之前:资源被视为新鲜,浏览器从本地缓存中提供该资源
  • 或者是之后:资源被视为过时,并且浏览器需要从服务器获取资源,因为它未被缓存
2.2.2.2.1.优点

它完全是本地决策。它不需要向服务器发送请求

2.2.2.2.2.不足
  • 是否使用本地缓存资源的决定是基于启发式的。尽管值Expiry是未来的,但资源可能已在服务器端发生变化,因此浏览器会提供过期的资源。相反,浏览器可能会因为时间已到而发送请求,但资源尚未发生变化。

  • Expire这非常基本。资源要么是新鲜的,要么是陈旧的;要么从中返回,Cache要么再次发送请求,控制的维度有限。

2.2.2.3.Cache-Control

Cache-Control的目标:

  • 绝不缓存资源
  • 在提供资源之前,验证是否应从缓存中提供资源
  • 中间缓存(代理)可以缓存资源吗?
    Cache-Control的基本实现流程:

在这里插入图片描述
由于Cache-Control和Expire一样都是客户端本地的,具体来说就是如果需要,浏览器会从其缓存中提供资源,而无需向服务器发出任何请求。

2.2.2.4.Last-Modified 和 ETag

为了避免提供过期资源的风险,浏览器必须向服务器发送请求。输入Last-Modified响应标头。 If-Modified-Since与请求Last-Modified标头配合使用:

The If-Modified-Since request HTTP header makes the request conditional: the server sends back the requested resource, with a 200 status, only if it has been last modified after the given date. If the resource has not been modified since, the response is a 304 without any body; the Last-Modified response header of a previous request contains the date of last modification. Unlike If-Unmodified-Since, If-Modified-Since can only be used with a GET or HEAD.
在这里插入图片描述

注意:
具有和其他非幂等方法If-Unmodified-Since的相反功能:它返回HTTP 错误,以避免覆盖已更改的资源。POST412 Precondition Failed。

分布式系统中时间戳的问题在于无法保证系统中的所有时钟都具有相同的时间。时钟以不同的速度漂移,需要定期同步Last-Modified到同一时间。因此,如果生成标头的服务器和接收标头的服务器If-Modified-Since不同,则结果可能会因它们的漂移而出乎意料。请注意,这也适用于标Expire头。

Etags 是时间戳的替代方案,可避免上述问题。服务器计算所提供资源的哈希值,并将ETag包含该值的标头与资源一起发送。当新请求包含If-None-Match哈希值时,服务器会将其与当前哈希值进行比较。如果它们匹配,则返回304如上所述的哈希值。

与仅提供时间戳相比,计算哈希值的开销较小,但现在被认为是一种很好的做法。

2.2.2.5.缓存 API

客户端最新的缓存方式是通过Cache API。它提供了一个通用的缓存接口:你可以将其视为浏览器提供的本地键值。

缓存 API提供以下方法:

  • Cache.match(request, options)

返回Promise解析与对象中第一个匹配的请求相关的响应Cache。

  • Cache.matchAll(request, options)

返回Promise解析为对象中所有匹配响应的数组Cache。

  • Cache.add(request)

获取 URL,检索它并将生成的响应对象添加到给定的缓存中。这在功能上等同于调用fetch(),然后使用put()将结果添加到缓存中。

  • Cache.addAll(requests)

获取 URL 数组,检索它们,并将生成的响应对象添加到给定的缓存中。

  • Cache.put(request, response)

接受请求及其响应并将其添加到给定的缓存中。

  • Cache.delete(request, options)

查找Cache以请求为键的条目,如果找到匹配的条目并将其删除,则返回Promise解析为的条目。如果未找到任何条目,则解析为。trueCacheCachePromisefalse

  • Cache.keys(request, options)

返回Promise解析为键数组的Cache。

Cache API 与Service Workers配合使用。流程很简单:

首先在 URL 上注册一个 Service Worker,浏览器在 URL 获取调用之前调用该 worker,从 worker 中,你可以从缓存中返回资源,并避免向服务器发出任何请求,它允许我们在初始加载后将资源放入缓存中,以便客户端可以离线工作 ,而具体效果取决于用例。

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

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

相关文章

【Linux】-Flink分布式内存计算集群部署[21]

注意: 本节的操作,需要前置准备好Hadoop生态集群,请先部署好Hadoop环境 简介 Flink同spark一样,是一款分布式内存计算引擎,可以支撑海量数据的分布式计算 Flink在大数据体系同样是明星产品,作为新一代的…

ElasticSearch集群重平衡(Shard allocation)案例分析及性能调优

何谓重平衡 ElasticSearch为了使数据平均分布在集群节点上,重平衡机制会由Master节点决定索引分片具体分配到哪个Data节点以及何时在节点之间迁移分片,使分片在数据大小、分片数量的层面上尽可能均匀分布在集群中的所有Data节点,充分发挥每个…

css - sass or scss ?

总的来说,Sass 和 SCSS 提供的功能是一样的,选择哪种语法主要取决于你的个人或团队的偏好。

4.2 循环语句(for, while)

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…

期货学习笔记-横盘行情学习1

横盘行情的特征及分类 横盘行情的概念 横盘行情时中继形态的一种,一般常出现在大涨或大跌之后出现横盘行情是对当前趋势行情的修正,是对市场零散筹码的清理,是为了集中筹码更便于后期行情的展开 横盘行情的特征 1.水平运动:该…

【文献阅读】ESG评级不确定性对企业绿色创新的影响研究

ESG评级不确定性对企业绿色创新的影响研究 张张张三丰de思考与感悟 论文内容总结:本文主要是关于ESG评级不确定性(也即来自三个评级机构的ESG得分差异),对企业绿色创新的影响。并且有效地区分了创新数量和创新质量。创新数量的是专…

iptablese防火墙【SNAT和DNAT】

目录 1.SNAT策略及应用 1.1SNAT原理与应用 1.2 SNAT策略的工作原理 1.3 实验操练 2.DNAT策略 2.1 DNAT策略的概述 2.2 DNAT原理与应用 2.3 实验操练 1.SNAT策略及应用 1.1SNAT原理与应用 SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet&#xf…

uniappx 应用未读角标插件(完善推送、通知、消息效果) Ba-Shortcut-Badge-U

简介(下载地址) Ba-Shortcut-Badge-U 是设置应用未读角标的原生插件,UTS版本(同时支持uniapp和uniappx) 支持设置未读、清空未读支持机型有Huawei、oppo、xiaomi、Samsung、Sony、LG、HTC、ZUK、ASUS、ADW、APEX、NO…

快速将短信从 Android 传输到 iPhone [支持 iPhone 15]

短信中包含有关工作和生活的重要信息,因此当我们拿到新手机时,它们不会丢失。今天,我们要讨论的是如何将短信从Android快速传输到iPhone,包括最新的iPhone 15。在Android和iOS操作系统之间,我们可以轻松地将短信从Andr…

C语言(指针)8

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

BUUCTF-misc23

[GUET-CTF2019]zips1 1.打开附件 是一个加密的压缩包 2.暴力破解压缩包 得到压缩包密码 3.010Editor 解密之后又得到一个加密的压缩包 发现不是解密文件 用010Editor打开是伪加密,将09 00 给为 00 00 4.Python 用Python运行文件里的部分内容,发现密…

高精度可编程直流电源功能

在电子产品开发和测试中,高精度可编程直流电源是一种非常重要的工具。它不仅能够提供稳定可靠的电源供应,还能够精确地控制输出电压和电流,满足各种复杂的测试需求。下面我们就来详细了解一下高精度可编程直流电源的功能特点。 1. 输出精度高 高精度可…

基于深度学习OCR文本识别

第一步:概要 基于深度学习OCR文本识别分为两个模块:DBNet和CRNN。 DBNet是基于分割的文本检测算法,算法将可微分二值化模块(Differentiable Binarization)引入了分割模型,使得模型能够通过自适应的阈值图进行二值化,并…

php发送短信功能(创蓝短信)

一、以下是创蓝发送短信的功能&#xff0c;可以直接执行&#xff1a; <?php$phone 12312312312;$msg 测试短信功能;echo 发送手机号&#xff1a;.$phone.<br/>;echo 发送内容&#xff1a;.$msg.<br/>;$send sendMessage($phone, $msg);var_dump($send);…

HQL面试题练习 —— 品牌营销活动天数

题目来源&#xff1a;小红书 目录 1 题目2 建表语句3 题解 1 题目 有营销活动记录表&#xff0c;记录了每个品牌每次营销活动的开始日期和营销活动的结束日期&#xff0c;现需要统计出每个品牌的总营销天数。 注意&#xff1a; 1:苹果第一行数据的营销结束日期比第二行数据的营…

sam代码简析

Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(零样本迁移性)转移到新的图像分布和任务&#xff0c;一个图像分割新的任务、模型和数据集…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境&#xff1a;vps&#xff0c;centos7&#xff0c;python3。 近期写了个python程序&#xff0c;用青龙面板在centos上运行。程序中有while无限循环&#xff0c;但是我在青龙中设置了定时任务&#xff08;每隔半小时运行一次&#xff09;&#xff0c;于是造成了进程中有多个…

Java进阶16 单元测试XML注解

Java进阶16 一、单元测试 单元测试就是针对最小的功能单元编写测试代码&#xff0c;Java程序最小的功能单元是方法&#xff0c;因此&#xff0c;单原测试就是针对Java方法的测试&#xff0c;进而检查方法的正确性。简单理解就是测试代码的工具。 1、Junit 1.1 Junit引入 目…

全面了解CC攻击和防范策略

前言 “ CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽&#xff0c;一直到宕机崩溃。” 什么是CC攻击&#xff1f; CC攻击前身是一个名为Fatboy的攻击程序&#xff0c;而之所以后来人们会称之为CC&#xff0c;也叫HTTP-FLOOD&#xff…