前端缓存介绍以及实现方案

news/2024/9/17 7:55:19/ 标签: 前端, 缓存, 性能优化

1.HTTP code 为304

HTTP 304 是一种服务器响应状态码,表示资源未被修改,客户端可以使用本地缓存**[浏览器内存缓存、本地电脑磁盘缓存]**的副本而不需要重新下载资源。这个过程通常涉及到浏览器向服务器发送请求,并在请求头中带有资源的 ETag 或 Last-Modified 时间戳,服务器检查资源是否有更新。如果没有更新,服务器返回 304 状态码,浏览器则从缓存中加载资源。这减少了数据传输,提高了页面加载速度。

2.内存缓存(Memory Cache)

内存缓存是指将资源存储在浏览器的内存中。这种缓存非常快速,因为访问内存的速度远远快于访问磁盘或网络。然而,内存缓存是短暂的,一旦浏览器或页面关闭,内存缓存的内容就会被清除。内存缓存通常用于缓存那些在短时间内频繁使用的资源,比如图片、样式表和脚本文件,以便在页面切换或重新加载时能够快速访问。

3. 磁盘缓存(Disk Cache)

磁盘缓存是指将资源存储在硬盘上。相对于内存缓存,磁盘缓存的存储时间更长,并且即使在浏览器关闭后也能保留。下次访问相同的资源时,浏览器会优先从磁盘缓存中读取。这种缓存的读取速度虽然比内存缓存慢,但比重新从网络加载要快得多。磁盘缓存通常用于存储那些不需要频繁更新的资源。

4. 如何触发磁盘缓存

要实现磁盘缓存,通常是通过浏览器的 HTTP 缓存机制来完成的。浏览器会根据服务器返回的 HTTP 响应头中的缓存策略,决定是否将资源存储到磁盘上,以及何时使用缓存。以下是实现磁盘缓存的常见方法和步骤:

4.1 设置 HTTP 响应头

服务器通过设置以下几个 HTTP 响应头来控制资源的缓存行为,包括是否存储到磁盘以及缓存的有效期。

常见的 HTTP 响应头字段:

**Cache-Control:**控制缓存行为的最重要字段,可以设置是否允许缓存缓存的最大存活时间等。常用的指令包括:
max-age=:指定资源的缓存时间,单位是秒。在这个时间内,浏览器可以直接从缓存中读取资源,而不需要向服务器重新请求。
**no-store:**告诉浏览器不要缓存这个资源,既不保存在内存中,也不保存在磁盘上。
no-cache:浏览器可以缓存资源,但每次使用缓存前需要向服务器验证资源是否更新(例如通过 ETag 或 Last-Modified)。
public/private:指定资源是否可以被公共缓存或仅限于用户的本地缓存
**Expires:**指定一个绝对时间,表示缓存的到期时间。在这个时间之前,资源可以直接从缓存中读取。该字段被 Cache-Control: max-age 所取代,但仍然可以用作备用方案。
ETag:是资源的一个唯一标识符。当客户端发送带有 ETag 的请求时,服务器会检查资源是否更新。如果未更新,返回 304 状态码,从而让浏览器继续使用缓存
**Last-Modified:**标识资源的最后修改时间。与 ETag 类似,浏览器在请求资源时可以带上 If-Modified-Since 请求头,服务器根据这个时间判断资源是否更新。

Cache-Control: public, max-age=31536000
ETag: "abcdef12345"
last-modified:Fri, 02 Aug 2024 12:54:18 GM

这个响应头表示资源可以被缓存 1 年,并使用 ETag 来检测资源更新。

4.2 如何触发磁盘缓存

浏览器根据 Cache-Control 头中的 max-age 指令决定资源是否缓存。如果资源的缓存时间较长,并且资源大小较大,浏览器往往会将其存储在磁盘上。这是因为内存缓存一般用于短期且频繁的资源访问,而磁盘缓存用于长期存储。
常见触发磁盘缓存的条件:

  • 资源的缓存时间较长(max-age 设置较大)。
  • 资源的大小比较大(例如图片、视频等静态资源)。
  • 浏览器关闭后,资源仍然可以从缓存中读取。

4.3 使用 Service Worker 缓存

除了传统的 HTTP 缓存策略,现代 Web 开发中可以使用 Service Worker 来更灵活地控制缓存行为。Service Worker 允许开发者直接编写脚本来拦截网络请求,并将资源缓存到磁盘中,这为离线应用和更高级的缓存策略提供了支持。

self.addEventListener('install', function(event) {event.waitUntil(caches.open('my-cache').then(function(cache) {return cache.addAll(['/index.html','/styles.css','/script.js',]);}));
});self.addEventListener('fetch', function(event) {event.respondWith(caches.match(event.request).then(function(response) {return response || fetch(event.request);}));
});
这个示例展示了如何通过 Service Worker 将资源缓存到磁盘中,并在请求时优先从缓存中读取资源。

5. 浏览器开发者工具查看缓存

你可以使用浏览器的开发者工具(通常是 F12)来查看缓存策略的执行情况:

  • 在 Network 选项卡下,可以看到每个请求的缓存状态,如 from disk cache 或 from memory cache。
  • 在 Application 选项卡下的 Cache Storage 或 Service Workers 选项,可以查看缓存的资源。

总结:

  1. 设置合适的 HTTP 缓存头(如 Cache-Control, ETag, Last-Modified)是实现磁盘缓存的关键。
  2. Service Worker 可以提供更精细的缓存控制
  3. 浏览器会根据缓存策略和资源大小、生命周期自动决定是否将资源存储到磁盘上。
  4. HTTP 304:是一种服务器响应状态码,用于确认客户端的缓存副本是最新的,从而避免不必要的数据传输。
  5. 内存缓存:存储在浏览器内存中,读取速度最快,但生命周期较短,适合短期内频繁使用的资源。
  6. 磁盘缓存:存储在硬盘中,读取速度相对较慢,但生命周期较长,适合较长时间内可能会重复使用的资源。

缓存虽然也会送http请求,但是它减少了从服务器端发送回数据并解析的时间,从而提升了页面的渲染速度,提高了性能


http://www.ppmy.cn/news/1522389.html

相关文章

【C/C++】web服务器项目开发总结【请求 | 响应 | CGI】

博客主页:花果山~程序猿-CSDN博客 文章分栏:Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一,背景 二&…

Windows自动化应用程序已启动/未启动,有进程无进程情况-拽起应用程序

问题分析: 应用程序能够自动登录, 可以打开后自动登录情况 我的处理方案是: 先通过 pywinauto打开应用程序, 然后,关闭前台 然后通过WinAppDriver去再次连接, 把应用置于前台 从而继续后面的元素定位 # 需要启动Hworkfrom pywinauto.application import Application# 启动Appli…

Java安全-动态加载字节码

文章目录 介绍定义ClassLoader简介 示例字节码文件URLClassLoaderdefineClassTemplatesImplBCEL ClassLoader 参考链接 介绍 定义 严格来说,Java字节码(ByteCode)其实仅仅指的是Java虚拟机执行使用的一类指令,通常被存储在.clas…

RabbitMQ 03 在项目中的实际使用: 告警,批处理

01.例子,解耦合(使用异步) 1.1异步思想:不会专门等待 1.2 例子:程序执行 1.3 如何设计程序 多线程: 订单请求模块只用于发送请求和处理确认,订单处理模块专门用于处理请求并且发送确认信…

MySQL常用函数(总结)详细版

1. 字符串函数 CONCAT(str1, str2, ...):将多个字符串连接成一个字符串。 SELECT CONCAT(Hello, , World); LENGTH(str):返回字符串的长度(字节数)。 SELECT LENGTH(Hello); SUBSTRING(str, pos, len):从字符串 …

【JAVA】第四天

JAVA第四天 一、Object类二、Objects类三、包装类四、字符串修改 一、Object类 表格: 方法名作用public String toString()返回对象的字符串表示形式public boolean equals(Object o)判断两个对象是否相等protected Object clone​()对象克隆 注意 toString() 和…

某里227逆向分析

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除! 前言 这次会简单的讲解…

【观察者】设计模式:构建灵活且响应式的软件系统

引言 在软件开发中,我们经常面临需要在多个对象之间进行通信的挑战。特别是当一个对象的状态发生变化时,我们希望所有依赖于这个状态的对象都能自动更新。这就是观察者设计模式大显身手的地方。 简介 观察者模式是一种行为设计模式,它定义…

C++——STL(vector类)

1.vector的介绍 vector的文档介绍 vector是表示可变大小数组的序列容器。vector就像数组一样,拥有连续的储存空间来储存元素,这就意味着可以通过下标的方式来访问vector的元素,很高效;但与数组不同的是vector的大小是动态改变的…

逻辑学(Logic)

GPT-4o (OpenAI) 逻辑学是研究论证的原则和标准的学科,主要关注如何正确地推理和论证。从抓取股票日线数据到形成有效的分析,我们可以应用逻辑推理。 逻辑推理步骤: 1. 明确目标:我们要抓取股票的日线数据。 2. 分析需求&#x…

图像分割分析效果2

这次加了结构化损失 # 训练集dice: 0.9219 - iou: 0.8611 - loss: 0.0318 - mae: 0.0220 - total: 0.8915 # dropout后:dice: 0.9143 - iou: 0.8488 - loss: 0.0335 - mae: 0.0236 - total: 0.8816 # 加了结构化损失后:avg_score: 0.8917 - dice: 0.9228 - iou: 0.…

标贝科技个性化音色定制方案 解锁语音合成无限可能

近日,标贝科技语音合成音色库又有新进展。针对智能客服场景,上新两个温和风格音色,适用于服务回访、业务咨询、产品介绍等细分业务场景。加上前不久的两款严肃客服音色,标贝科技已累计上线20多个风格迥异的男女客服发音人&#xf…

pyecharts可视化数据大屏

1. 简介 1.1. 概述 PyECharts 是一个用于生成 ECharts 图表的 Python 库。ECharts 是一款由阿里巴巴开发的开源 JavaScript 图表库,广泛应用于网页端的数据可视化。而 PyECharts 将 ECharts 的功能带到了 Python 环境中,使得 Python 开发者可以方便地在数据分析、机器学习等…

windows版本mysql8.2忘记密码

忙了一年的项目终于有点空闲时间了(996累成狗),想折腾点开源项目, 结果发现忘了本地mysql密码,查了一些资料,记录如下: --windows mysql8.2忘记密码(思路整理:先无密码…

共享单车轨迹数据分析:以厦门市共享单车数据为例(一)

共享单车数据作为交通大数据的一个重要组成部分,在现代城市交通管理和规划中发挥着越来越重要的作用。通过对共享单车的数据进行深入分析,城市管理者和规划者能够获得大量有价值的洞察,这些洞察不仅有助于了解城市居民的日常出行模式&#xf…

ELK学习笔记(一)——使用K8S部署ElasticSearch8.15.0集群

一、下载镜像 #1、下载官方镜像 docker pull elasticsearch:8.15.0 #2、打新tag docker tag elasticsearch:8.15.0 192.168.9.41:8088/new-erp-common/elasticsearch:8.15.0 #3、推送到私有仓库harbor docker push 192.168.9.41:8088/new-erp-common/elasticsearch:8.15.0二、…

在 Linux 和类 Unix 系统中,终端(Terminal)和 Shell

在 Linux 和类 Unix 系统中,终端(Terminal)和 Shell 是两个相关但不同的概念。以下是它们的定义和关系: 1. 终端(Terminal) 终端 是一个用于与计算机交互的用户界面。它可以是一个物理设备(如…

基于SSM+Vue+MySQL的可视化高校公寓管理系统

系统展示 管理员界面 宿管界面 学生界面 系统背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的…

【免费分享】GIS开发面试题(流程+自我介绍+基础篇+Openlayermapbox)

本篇文章针对GIS应届生就业方向及面试困惑问题进行了收集整理,并列出了关于GIS开发面试中常见的问题(含答案)。 “ 包括以下内容 前言 简介 面试之前 面试流程 自我介绍-AI 基础篇 1、GIS八股文基础篇 2、Openlayers图形绘制 3、倾…

AXI4总线详解

AXI4简介 起初SoC片上总线处于发展阶段,不像微机总线那样成熟,目前还没有统一的标准,因此各大厂商和组织纷纷推出自己的标准,以便在未来的SoC片上总线标准中占有一席之地。ARM公司就在1995年推出了自己的总线——AMBA&#xff08…