前端性能优化 | CDN缓存

前言

CDN(Content Delivery Network)是一种分布式的网络架构,通过在全球各地部署节点服务器来快速传输和分发网络内容。CDN的主要目标是提供快速、可靠的内容传输,以提升用户体验。

本文主要从以下方面讲解CDN

  • 什么是CDN
  • CDN的作用
  • CDN的原理
  • CDN的使用场景

一、什么是 CDN

1. CDN 的概念

CDN是内容分发网络(Content Delivery Network)的缩写,是一种通过在全球各地分布的服务器上存储和传输网络资源(如 HTML 页面、图片、视频、应用程序等)的技术架构。

image.png

2. CDN 系统的构成

  1. 原始服务器(Origin Server):也称为源服务器,是存储网站内容(如HTML、CSS、JavaScript、图片、视频等)的主要服务器。

  2. 节点服务器(Edge Servers):也称为边缘服务器或CDN节点,分布在全球各个地理位置。

  3. 节点选择器/调度器(Node Selector/Load Balancer):是CDN系统的核心组件之一,用于选择与用户最接近的节点服务器。

  4. 缓存(Cache):CDN节点服务器上的缓存用于存储网站内容的副本。当用户请求访问网站的内容时,CDN节点会先检查自己的缓存中是否存在所需内容的副本。

  5. 内容传输网络(Content Delivery Network):CDN网络是由一系列节点服务器组成的分布式网络,这些节点服务器相互连接,以实现内容的快速传输和访问。

  6. 内容管理系统(Content Management System):部分CDN系统还提供内容管理系统,用于帮助网站管理员管理和控制网站内容的分发、缓存和更新等操作。

这些组件共同协作,构成了一个完整的CDN系统,以提供快速、高效和可靠的内容分发服务。

二、CDN 的作用

CDN一般会用来托管Web资源 (包括文本、图片和脚本等),可供下载的资源(媒体文件、软件、文档等),应用程序 (门户网站) 等 。

  • 加速网站访问:通过将网站的动态内容缓存在离用户最近的节点服务器上,实现就近访问,减少内容传输的距离和网络延迟。大幅提高网站的访问速度,加快加载,提升用户体验。

  • 节约网络带宽:将网站的静态资源缓存在多个节点服务器上,当用户访网站时,大部分的资源可以从离用户较近的节点服务器上获取,少了对原始服务器的访问。减轻了源服务器的负载压力,节约了网络带宽的使用,提高了整体的网络效率。

  • 提高网站的可用性和稳定性:通过分布在全球各地的节点服务器,在原始服务器发生故障或服务不可用时,可以自动切换到其他可用的节点服务器,确保网站内容的可持续提供。这种容灾备份机制可以提高网站的可用性和稳定性,减少中断的风险。

  • 抵御网络攻击:由于CDN节点分布广泛,网络流量可以在多个节点服务器上进行均衡分散,有效减轻了源服务器的负载和DDoS攻击带来的影响。CDN还可以使用如防火墙、入侵检测系统等一些安全机制和防御措施,保护网站免受恶意攻击。

  • 提供高质量的视频内容传输:通过将视频内容缓存在离用户最近的节点服务器上,CDN可以提供更快速、稳定的视频播放体验,避免视频卡顿、加载缓慢等问题。

综上所述,CDN的作用是提供快速、可靠的内容分发服务,加速网站访问、节省网络带宽、提高可用性和稳定性,抵御网络攻击,提供高质量的视频内容传输,从而改善用户体验,提升网站的性能和效果。

三、CDN 的原理

image.png

以用户访问浏览器某网址(www.example.com) 时为例,CDN的加速流程通常包括以下几个步骤:

  1. 域名解析:当用户在浏览器中输入网址并按下回车键后,浏览器会向本地DNS服务器发送域名解析,本地DNS服务器会返回CDN的负载均衡器的地址。

  2. 负载均衡:浏览器根据负载均衡器的IP地址,向CDN负载均衡器发送请求。载均衡器的作用是选择一个最合适的CDN节点服务器来响应用户的请求。

  3. 缓存判断CDN节点服务器收到用户的请求后,会先判断请求资源是否缓存在其本地服务器上。如果有,则直接返回缓的资源,这样可以大大提高响应速度和节省带宽消耗。如果没有缓存的资源,则进入下一步。

  4. 源服务器回源:当节点服务器没有缓存所需的资源时,会向源服务器发送请求,获取资源的原始本。源服务器可以是网站的服务器、视频流媒体的视频源服务器等,根据不同的业务需求而定。

  5. 传输加速:源服务器将请求资源发送给节点服务器后,节点服务器会将资源按照缓存策略进行存储,并将资源回传给用户的浏览器。由于CDN节点服务器通常位于离用户更近的一方,因此传输时间较短,用户可以更快地获取请求的资源。

  6. 动态内容回源:对于一些动态生成的内容或需要实时更新的资源(如用户个人信息、实时天气数据等),CDN节点服务器需要及时回源更新这些内容,以保证数据的实时性和准确性。

总的来说,CDN加速流程包括域名解析负载均衡缓存判断源服务器回源传输加速动态内容回源等步骤。通过减少访问迟、节省带宽消耗和提供更好的用户体验,CDN可以提供快速、稳定和可靠的内容分发服务。

四、CDN 的使用场景

前端使用CDN可以使网站或应用的静态资源(如样式表、JavaScript文件、字体、图像等)从离用户更近的节点服务器加载,从而提高网页加载速度和用户体验。以下是前端使用CDN的几个常见实例:

1. 加载公共库和框架

许多前端开发者使用公共库和框架来加速开发和提供更好的用户体。常见的如jQuery、React、Vue.js等。通过使用CDN加载这些公库,可以将它们缓存在CDN的节点服务器上,提供更快速的加载和传输,无需在本地部署维护这些库的副本。

例如,使用CDN jQuery库:

<script src="https://cdn.jsdelivr/npm/jquery@3.60/dist/jquery.min.js"></script>

2. 加载图标字体

图标字通常用于网站的图标展示,如Font Awesome、Bootstrap等使用CDN加载这些图标字体,可以减少字体的加载时间和带宽消耗。例如,使用CDN加载Font图标字体:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome5.15.4/css/all.min.css" />

3. 加载样式

使用CDN加载常用的样式表文件,如Normalize.css、Bootstrap等,可以降低式表文件的加载时间和提高页的兼容性。例如,使用CDN加载Normalize样式表:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/normalize@8.0.1/normalize.min.css" />

4. 加载JavaScript库和件

如果网站或应用使用了一些常见的JavaScript库和插件,如Moment.js、Swiper等,可以使用CDN加载它们,避免自行下载和部署这些文件。例如使用CDN加载Moment.js:

<script src="://cdn.jsdelivr.net/npm/moment@2.29.1/moment.min.js"></script>

5. 加载图片CDN

我们打开稀土掘金网站,随便打开一篇文章,我们可以很多图片都是从 CDN 服务器上请求来的,这极大的提高了图片的响应速度。

image.png

五、常用的前端 CDN 库

名称优势官网
jsDelivr基于 MaxCDN 的一个免费开源的 CDN 解决方案 http://www.jsdelivr.com
CDNJS提供非常完整的 JavaScript 库 http://www.cdnjs.com
BootCDN目前前端开源的项目几乎都涵盖了,支持http和https http://www.bootcdn.cn
Staticfile CDN基于 CDN 加速由七牛云提供包括 JS、CSS、image 和 swf 等静态文件的,支持http和https https://www.staticfile.org
jQuery CDN一个只有 jQuery 的 CDN http://code.jquery.com
百度云资源站基于百度云的资源站,各种开发语言的 SDK 均可以免费下载 https://cloud.baidu.com/doc/Developer/index.html

总结

CDN主要用于在全球范围内加速静态内容、动态内容和流媒体的传输。通过在各地部署节点服务器,将内容缓存到离用户更近的服务器上,从而提供更快速、可靠和高效的内容传输。

CDN缓存在前端性能优化中的主要用于加速静态资源加载减轻服务器负载,以及缓解网络拥塞等方面。合理利用CDN缓存,能够大幅提升网页性能,提高用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

同一交换机下不同网段的终端通信

文章目录 一个有趣的实验 大家都知道不同网段的IP地址要想通信需要通过网关进行路由转发&#xff0c;而一般通过路由器来做默认网关。 一个有趣的实验 一台二层交换机下&#xff0c;连接两个不同网段的PC&#xff0c;实现彼此之间的通信。 一台S3700交换机&#xff0c;两台PC。…

LabelImg:一个简单易用的图像标注工具

目录 LabelImg是什么&#xff1f; 如何使用LabelImg进行图像标注&#xff1f; LabelImg的优势和应用场景 在哪里下载它 随着人工智能技术的不断发展&#xff0c;机器学习和深度学习在图像识别、目标检测等领域中得到了广泛的应用。而要训练一个有效的模型&#xff0c;通常需…

如何提高内存和cpu使用率呢?-Linux类资源

最近公司项目上线时&#xff0c;红蓝线巡检时&#xff0c;部分服务器因配置高但使用率低而需要降级。 为了避免降级&#xff0c;如何增加内存和CPU使用率&#xff1f; 这可以通过脚本来实现。 当前服务器操作系统版本&#xff1a;-7_5。 连接服务器后&#xff0c;登录账号。 …

JVM系列:垃圾回收器(GC)

JVM系列&#xff1a;垃圾回收器&#xff08;GC&#xff09; &#x1f600; 执行引擎将class文件加载至JVM内存中运行。在运行过程中&#xff0c;需要在内存中动态创建和销毁对象。在传统的C/C语言中&#xff0c;需要手动进行对象销毁以避免内存泄漏。而在Java中&#xff0c;引入…

Leetcode笔记——二叉树的迭代遍历

中序遍历&#xff1a; 定义一个 保存中间量的栈 和一个 结果数组 1. 模板写法 注释版&#xff1a; 背诵版&#xff1a; 前序遍历 1. 中 右 左 的顺序遍历 2. 模板写法&#xff0c;按中 左 右 的顺序遍历 后序遍历 1. 模板写法&#xff0c;按左 右 中 的顺序遍历 注释版&am…

STM32单片机基本原理与应用(十一)

语音识别实验 此实验采用STM32核心板 LD3320模块&#xff0c;通过初始化LD3320并写入待识别关键词&#xff0c;对麦克风说出相应关键词&#xff0c;实现实训平台上的流水灯相应变化的效果。 LD3320 是一颗基于非特定人语音识别 &#xff08;SI-ASR&#xff1a;Speaker-Indepen…

【深度学习笔记】优化算法——Adam算法

Adam算法 &#x1f3f7;sec_adam 本章我们已经学习了许多有效优化的技术。 在本节讨论之前&#xff0c;我们先详细回顾一下这些技术&#xff1a; 在 :numref:sec_sgd中&#xff0c;我们学习了&#xff1a;随机梯度下降在解决优化问题时比梯度下降更有效。在 :numref:sec_min…

从element-plus 引入ILoadingInstance 出现类型错误

具体报错如下图所示&#xff1a; 1、引入ILoadingInstance 出现错误&#xff1a; 解决问题如下所示&#xff1a; 可能是因为element-plus 多次升级原因&#xff0c;将原来的内部代码多次改下了&#xff0c;原来是loading.type文件&#xff0c;现在变成loading.js&#xff0c;包…

卷积神经网络必备基础

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09; 传统的全连接神经网络并不适用于图像处理&#xff0c;这是因为&#xff1a;每个像素点都是一个输入特征&#xff0c;随着层数的增加&#xff0c;参数以指数级增长&#xff0c;而图片的像素点往往非常…

【STM32】HAL库 CubeMX 教程 --- 高级定时器 TIM1 定时

实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM1&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列&#xff1a; 所有 TIM 的时钟频率都是72MHz&#xff1b;F103C8不带基本定时器&#xff0c;F103RC及以上才带基本定时器。…

2024.3.10 win11系统设置环境变量的方法

2024.3.10 win11系统设置环境变量的方法 win11和其他版本略有区别&#xff0c;以安装maven为例进行操作。 一、鼠标右键点击下拉菜单中选择“个性化” 二、点击个性化中选项后在左侧菜单选择“系统” 三、在右侧系统项目中选择“系统信息” 四、在系统信息中选择“高级系统…

Android将自己写的maven库上传至jitpack(2024靠谱版)

浏览了一堆陈年旧贴&#xff0c;终于实验成功了 第一步 将自建空项目同步至github并保证能正常运行第二步新增一个library类型的modul第三步 在新建的library里面写一些测试用的代码第四步在library的gradle文件增加插件和发布脚本第五步新建一个配置文件第六步 把所有更改push…

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时&#xff0c;通常使用 Redis 的字符串&#xff08;String&#xff09;。Redis 的字符串是最基本的数据类型&#xff0c;一个键对应一个值&#xff0c;它能够存储任何形式的字符串&#xff0c;包括二进制数据。字符串类型的值最多可以是 512MB。 Re…

基于java+springboot+vue实现的火车票订票系统(文末源码+Lw)294

摘要 火车票订票系统可以对火车票订票系统信息进行集中管理&#xff0c;可以真正避免传统管理的缺陷。火车票订票系统是一款运用软件开发技术设计实现的应用系统&#xff0c;在信息处理上可以达到快速的目的&#xff0c;不管是针对数据添加&#xff0c;数据维护和统计&#xf…

SaulLM-7B: A pioneering Large Language Model for Law

SaulLM-7B: A pioneering Large Language Model for Law 相关链接&#xff1a;arxiv 关键字&#xff1a;Large Language Model、Legal Domain、SaulLM-7B、Instructional Fine-tuning、Legal Corpora 摘要 本文中&#xff0c;我们介绍了SaulLM-7B&#xff0c;这是为法律领域量…

Keepalived+LVS构建高可用集群

目录 一、Keepalive基础介绍 1. Keepalive与VRRP 2. VRRP相关技术 3. 工作原理 4. 模块 5. 架构 6. 安装 7. Keepalived 相关文件 7.1 配置组成 7.2 全局配置 7.3 VRRP实例配置&#xff08;lvs调度器&#xff09; 7.4 虚拟服务器与真实服务器配置 二、Keepalived…

用*把棱形画出来

输入一个整数n表示棱形的对角半长度&#xff0c;请你用*把这个棱形画出来。 输入&#xff1a;1输出&#xff1a;*输入&#xff1a;3输出&#xff1a;**** *********输入输出格式 输入描述: 输入一个整数n&#xff08;n < 10&#xff09;。 输出描述: 按题目要求输出字符棱…

Jobs Portal求职招聘系统源码v3.5版本

源码介绍: Jobs Portal 求职招聘系统 是为求职者和公司发布职位而开发的交互式求职招聘源码。它使求职者能够发布简历、搜索工作、查看个人工作列表。它将提供各种公司在网站上放置他们的职位空缺资料&#xff0c;并且还可以选择搜索候选人简历。除此之外&#xff0c;还有一个…

Jupyter Notebook使用教程——从Anaconda环境构建到Markdown、LaTex语法介绍

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 你是否在视频教程或说明文档或Githu…

TC7.0简单编程十六进制跟十进制转化函数

写脚本的时候&#xff0c;没用内存的功能什么的&#xff0c;基本跟十六进制用得都比较少。最近因为易语言的一个代码要转化过来&#xff0c;看到易语言里面有现成的函数 16到10 跟10 到16&#xff0c;就想着TC是否也有这样的函数。找来找去没找到。其实TC也有这样的函数来的。藏…