CDN缓存

2023-05-16

CDN缓存那些事



CDN是什么?

谈到CDN的作用,可以用8年买火车票的经历来形象比喻:

8年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火车,火车票都要去市里的火车站购买,而从县城到市里,来回就是4个小时车程,简直就是浪费生命。后来就好了,小县城里出现了火车票代售点,可以直接在代售点购买火车,方便了不少,全市人民再也不用在一个点苦逼的排队买票了。

CDN就可以理解为分布在每个县城的火车票代售点,用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样海南移动用户的请求就不会千里迢迢跑到北京电信机房的服务器(假设源站部署在北京电信机房)上了。

CDN的优势很明显:(1)CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;(2)大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。

缓存是什么? 

这里不深究CDN背后高大上的架构,也不讨论CDN如何做到全局流量调度策略,本文着重讨论在有了CDN后,数据是如何被缓存的。缓存是一个到处都存在的用空间换时间的例子。通过使用多余的空间,我们能够获取更快的速度。
首先,看看没有网站没有接入CDN时,用户浏览器与服务器是如何交互的:

用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度。
如果中间加上一层CDN,那么用户浏览器与服务器的交互如下:
         
客户端浏览器先检查是否有本地缓存是否过期,如果过期,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,那么CDN还需要向源站发出回源请求(back to the source request),来拉取最新的数据。CDN的典型拓扑图如下:


图片来源: http://grefr.iteye.com/blog/2004248

可以看到,在存在CDN的场景下,数据经历了客户端(浏览器)缓存和CDN边缘节点缓存两个阶段,下面分别对这两个阶段的缓存进行详细的剖析

客户端(浏览器)缓存

客户端缓存的缺点 

客户端缓存减少了的服务器请求,避免了文件重复加载,显著地提升了用户地方。但是当网站发生了更新的时候(如替换了css、js以及图片文件),浏览器本地仍保存着旧版本的文件,从而导致无法预料后果。

曾几何时,一个页面加载出来,页面各元素位置乱飘,按钮点击失效,前端GG都会习惯性地问一句:“缓存清了没?”,然后Ctrl+F5       ,Everything is OK。但有些时候,如果我们是简单地在浏览器地址栏中敲一个回车,或者是仅仅按F5刷新,问题依然没有解决,你可知道这三种不同的操作方式,决定浏览器不同的刷新缓存策略?

浏览器如何来确定使用本地文件还是使用服务器上的新文件?下面来介绍几种判断的方法。

浏览器缓存策略

Expires 

Expires:Sat, 24 Jan 2015 20:30:54 GMT


如果http响应报文中设置了Expires,在Expires过期之前,我们就避免了和服务器之间的连接。此时,浏览器无需想浏览器发出请求,只需要自己判断手中的材料是否过期就可以了,完全不需要增加服务器的负担。

Cache-control: max-age
q555.png
Expires的方法很好,但是我们每次都得算一个精确的时间。max-age 标签可以让我们更加容易的处理过期时间。我们只需要说,这份资料你只能用一个星期就可以了。

Max-age 使用秒来计量,如:
Cache-Control:max-age=645672
指定页面645672秒(7.47天)后过期。

Last-Modified

服务器为了通知浏览器当前文件的版本,会发送一个上次修改时间的标签,例如:
Last-Modified:Tue, 06 Jan 2015 08:26:32 GMT
这样浏览器就知道他收到的这个文件创建时间,在后续的请求中,浏览器会按照下面的规则进行验证:
1.  浏览器:Hey,我需要jquery.min.js这个文件,如果是在 Tue, 06 Jan 2015 08:26:32 GMT 之后修改过的,请发给我。
2.  服务器:(检查文件的修改时间)
3.  服务器:Hey,这个文件在那个时间之后没有被修改过,你已经有最新的版本了。
4.  浏览器:太好了,那我就显示给用户了。
在这种情况下,服务器仅仅返回了一个304的响应头,减少了响应的数据量,提高了响应的速度。关于304响应,请参考:
http://www.cnblogs.com/ziyunfei/archive/2012/11/17/2772729.html
下图是按F5刷新页面后,页面返回304响应头。

ETag
 

通常情况下,通过修改时间来比较文件是可行的。但是在一些特殊情况,例如服务器的时钟发生了错误,服务器时钟进行修改,夏时制DST到来后服务器时间没有及时更新,这些都会引起通过修改时间比较文件版本的问题。

ETag可以用来解决这种问题。ETag是一个文件的唯一标志符。就像一个哈希或者指纹,每个文件都有一个单独的标志,只要这个文件发生了改变,这个标志就会发生变化。

服务器返回ETag标签:
ETag:"39001d-1762a-50bf790757e00"
接下来的访问顺序如下所示:
1. 浏览器:Hey,我需要jquery.min.js这个文件,有没有不匹配"39001d-1762a-50bf790757e00"这个串的
2. 服务器:(检查ETag…)
3. 服务器:Hey,我这里的版本也是"39001d-1762a-50bf790757e00",你已经是最新的版本了
4. 浏览器:好,那就可以使用本地缓存了
如同 Last-modified 一样,ETag 解决了文件版本比较的问题。只不过 ETag 的级别比 Last-Modified 高一些。

额外的标签

缓存标签永远不会停止工作,但是有时候我们需要对已经缓存的内容进行一些控制。
l  Cache-control: public 表示缓存的版本可以被代理服务器或者其他中间服务器识别。
l  Cache-control: private 意味着这个文件对不同的用户是不同的。只有用户自己的浏览器能够进行缓存,公共的代理服务器不允许缓存。
l  Cache-control: no-cache 意味着文件的内容不应当被缓存。这在搜索或者翻页结果中非常有用,因为同样的URL,对应的内容会发生变化。

浏览器缓存刷新
 

1.  
在地址栏中输入网址后按回车或点击转到按钮
浏览器以最少的请求来获取网页的数据,浏览器会对所有没有过期的内容直接使用本地缓存,从而减少了对浏览器的请求。所以,Expires,max-age标记只对这种方式有效。

2.  按F5或浏览器刷新按钮
浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,它能够让 Last-Modified、ETag发挥效果,但是对Expires无效。

3.  按Ctrl+F5或按Ctrl并点击刷新按钮
这种方式就是强制刷新,总会发起一个全新的请求,不使用任何缓存。

CDN缓存 

浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。

CDN缓存的缺点
 

CDN的分流作用不仅减少了用户的访问延时,也减少的源站的负载。但其缺点也很明显:当网站更新时,如果CDN节点上数据没有及时更新,即便用户再浏览器使用Ctrl +F5的方式使浏览器端的缓存失效,也会因为CDN边缘节点没有同步最新数据而导致用户访问异常。

CDN缓存策略 

CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的Cache-control: max-age的字段来设置CDN边缘节点数据缓存时间。

当客户端向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向源站发出回源请求,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。

CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。

CDN缓存时间会对“回源率”产生直接的影响。若CDN缓存时间较短,CDN边缘节点上的数据会经常失效,导致频繁回源,增加了源站的负载,同时也增大的访问延时;若CDN缓存时间太长,会带来数据更新时间慢的问题。开发者需要增对特定的业务,来做特定的数据缓存时间管理。

CDN缓存刷新

CDN边缘节点对开发者是透明的,相比于浏览器Ctrl+F5的强制刷新来使浏览器本地缓存失效,开发者可以通过CDN服务商提供的“刷新缓存”接口来达到清理CDN边缘节点缓存的目的。这样开发者在更新数据后,可以使用“刷新缓存”功能来强制CDN节点上的数据缓存过期,保证客户端在访问时,拉取到最新的数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CDN缓存 的相关文章

  • 边缘计算节点是啥?边缘计算与CDN有什么关系?一文带你了解边缘计算节点BEC(1)

    边缘计算节点是基于CDN边缘节点构建 xff0c 覆盖全国大部分地区 xff0c 三大运营商全覆盖 将算力下沉到各城市级节点 xff0c 提供离用户更近的算力资源 那么可能有些小伙伴会问 xff0c CDN也是就近为用户提供服务 xff0c
  • 前端js免费的CDN网站

    1 BootCDN http www bootcdn cn 目前前端开源的项目几乎都涵盖了 xff0c 支持http和https 2 百度静态资源公共库 http cdn code baidu com 一个是稳定 xff0c 快速 xff0
  • 利用CDN加速react webpack打包后的文件

    此文不介绍webpack基本配置 如果对基本配置有疑问请查阅官方文档 1 配置webpack config js 将output publicPath改成上传到的cdn地址 例 对应上面上传配置 publicPath https your
  • 网站接入CDN显示不正常无法加载HTTPS样式表

    网站接入腾讯云内容分发网络CDN后 显示不正常 网站加载的CSS样式表HTTP协议 无法加载HTTPS 如何解决 解决方法 修改回源协议为HTTPS即可 腾讯云CDN网站HTTPS样式表无法载入的解决方法 网站接入腾讯云CDN后 网站显示不
  • 【经验-强制HTTPS-web】在服务器301强制HTTPS跳转,套上腾讯云CDN后,第一次访问发生不强制跳转HTTPS的问题解决方法

    我的个人站网址 https mdzz pro 今天偶然在编程群里展示了下个人站 没想到大佬居然说我的网站没有开Https 我当场懵逼了 不可能啊 面板上我开了强制Https啊 于是我自己用edge访问了一下 结果发现真是这样 第一次 第二次
  • mac os如何使用rz、sz

    1 什么是rz sz 在线上真实生产环境中总会有上传文件到服务器 以及从服务器下载文件的需求 rz sz应用广泛 由于发送和接收都是在服务器上进行的 所以 rz received 接收 意味着向服务器上传 sz send 发送 意味着从服务
  • 什么是CDN?CDN的原理和作用是什么?

    一 什么是CDN CDN全称Content Delivery Network 即内容分发网络 CDN是Content Delivery Network 内容分发网络 的缩写 是一种利用分布式节点技术 在全球部署服务器 即时地将网站 应用 视
  • CDN架构

    CDN公司在整个互联网中部署了数以百计的节点 Cache服务器集群 这些Cache服务器都分布在各个网络运营商的IDC机房中 位置尽量靠近用户网络 CDN系统将内容从源站复制到各个节点 在内容提供者更新内容时 CDN系统将更新后的内容重新分
  • Webpack 4.X 配置cdn加载资源

    众所周知 SPA单页应用 首次访问需要加载近全部资源 从而导致首页渲染速度很慢 继而 出现很多性能优化方案 图片 资源懒加载 减少http请求 减小请求资源大小 减少dom操作避免触发回流重绘 gzip压缩 cdn加载等等 今天 我们就具体
  • HTTP/2 和文件下载

    我们提供文件托管解决方案 我们的客户是最终用户 他们通过 HTTP 1 1 协议访问我们的服务器并下载文件 这些客户端基本上是软件系统或 CDN 它们使用软件库下载我们的文件 没有人类用户访问我们的系统 我们还提供使用 HTTP 1 1 范
  • Google CDN 未对 jquery 进行 gzip 压缩

    如果我导航到这里 http ajax googleapis com ajax libs jquery 1 4 jquery min js 我使用 Firefox 3 6 3 下载了 70k 我可以确认它正在发送 Accept Encodin
  • 过期和CDNS - YSlow 问题

    首先我要提到的是 我已经进行了一些挖掘 但似乎找不到我要寻找的内容的正确答案 我正在开发一个使用一些外部资源的网站 谷歌分析 www google analytics com analytics js 最新的 jQuery 版本 http
  • Shopify CDN 的资产 URL 是如何生成的?

    假设我上传了一张名为 logo png 的图像到 Shopify 上的商店 在 Liquid 模板中 我可以为其生成一个 URL 如下所示 logo png asset url 这会生成一个 URL 例如 http static shopi
  • 间歇性 Cloudfront CDN 故障(监控)- CDN 故障转移

    在过去的 2 个月中 我遇到了 Amazon Cloudfront 间歇性故障 每周 2 3 次 页面将从我的 Web 服务器加载 但来自 CDN 的所有资产当时都会阻塞等待几分钟 我确认使用来自不同数据中心的 shell 卷曲 有些可以工
  • JS 依赖项应该打包在包中,还是通过 CDN 加载?

    我一直认为这个问题的答案是公共依赖项应该通过 CDN 加载 这样常见的 JS 库就会缓存在浏览器中 加载速度会更快 然而 许多在线图书馆 例如React 和 Angular 以及许多打包系统 例如Webpack 和 SystemJS 似乎是
  • 需要帮助了解 Firebase Storage CDN

    我正在构建一个有声读物应用程序 并将音频文件上传到 Firebase 存储上 我的问题是我在旧金山和多伦多经历了不同的表现 我的印象是 Firebase Storage 具有内置 CDN 如果是这样 我需要在某处启用它吗 如果没有 如何将
  • 为什么 requirejs 尝试加载 .map?

    我正在尝试从 CDN 具体来说是 cdnjs 加载脚本 并且在 requirejs 中您必须像这样保留扩展名 require config baseUrl static js paths underscore cdnjs cloudflar
  • 具有云功能的 Firebase 托管 - 如何清除/刷新 CDN 缓存?

    我按照该视频中的说明进行操作 到目前为止 一切都运行良好 直到我需要清除 CDN 中的旧 HTML https www youtube com watch v 7 2CJs VZk4 https www youtube com watch
  • CDN 上的 Dojo 与自己安装的 Dojo

    我使用了相当多的 Dojo 但迄今为止我仅通过包含来自 AOL Google 等 CDN 来使用它 托管 Dojo 副本而不是通过 CDN 使用它是否有优势 我没有太多需要改变代码库 但我想还有其他优点 缺点 通过托管您自己的 Dojo 环
  • CDN 不工作时如何加载本地文件

    我正在使用一些 CDN js 和 css 文件 我在Google上搜索了如果CDN不工作如何加载本地数据 我发现一个很好的链接是这样写的

随机推荐

  • SAINT:一个基于transformer的知识跟踪模型

    1 简介 SAINT Separated Self AttentIve Neural Knowledge Tracing 一个基于transformer的知识跟踪模型 本文根据 Towards an Appropriate Query Ke
  • SAKT:self attentive knowledge tracing知识跟踪模型

    1 简介 本文根据2019年 A Self Attentive model for Knowledge Tracing 翻译终结 SAKT xff1a self attentive knowledge tracing 知识追踪 xff08
  • Ubuntu 16.04 常用操作之二 :安装ssh 服务并配置ssh免密登入

    步骤一 xff1a 通过dpkg l grep ssh查看ssh的功能安装情况 Ubuntu16 04系统安装完毕以后 xff0c ssh的客户端已经默认安装 xff0c 但是服务端需要手动自己安装 步骤二 xff1a 直接安装的常用步骤
  • [实例教程] 用python开发android应用

    Python是动态语言 xff0c 比较简洁 Android不直接支持使用python开发应用 xff0c 需要使用其它中间件或者库 PythonForAndroid提供了在android平台上对python语言的支持 xff1b CLE支
  • 用JNI从C传递结构体到JAVA

    直接上C的实现 typedef struct Foo int len char name 100 Foo t JNIEXPORT jint JNICALL Java TestJNI foo JNIEnv env jobject obj jo
  • args = parser.parse_args() SystemExit: 2 解决方案

    问题描述 今天运行程序 xff0c 突然报错 xff1a args 61 parser parse args args 61 SystemExit 2 查阅网上解决方案无果 xff0c 于是自己检查了错误信息 xff0c 哦 xff0c 原
  • WORDS WORTH光与影的传说简明攻略

    WORDS WORTH光与影的传说简明攻略 摘自日攻 本来应该有地图版 xff0c 无奈我水平有限找不到 而且攻略写得主观色彩太重 xff0c 影响阅读 但在这里我还是要感谢日攻诸神 故事发生在遥远的古大陆 xff0c 那里有2个种族 光之
  • 在vc中实现获取汉字拼音的首字母

    在vc中实现获取汉字拼音的首字母 Author xff1a lixiaosan Date xff1a 05 26 2006 Syntax GetFirstLetter CString strName CString amp strFirst
  • 让Android应用程序申请获取ROOT权限

    有时候我们写 Android APP xff0c 需要让它获取 ROOT 权限 xff0c 那么如何让 APP 去向系统申请呢 xff1f 下面提供一个方法 xff0c 前提是系统是已经 ROOT 权限了 xff0c 能够执行能 su 命令
  • 一、JNI_OnLoad简介

    一 JNI OnLoad简介 Java JNI有两种方法 xff0c 一种是通过javah 获取一组带签名函数 xff0c 然后实现这些函数 这种方法很常用 xff0c 也是官方推荐的方法 还有一种就是JNI OnLoad方法 当Andro
  • Klib - C语言通用库

    samtools xff0c bwa等软件都会涉及到这个库 xff0c 在项目中也比较方便加入这个库 来自 xff1a https github com attractivechaos klib 简介 Klib是C语言写成的 xff0c 独
  • coverity下载 最新企业版离线安装包

    版权归作者所有 xff0c 任何形式转载请联系作者 作者 xff1a 技术支持 xff08 来自豆瓣 xff09 来源 xff1a https www douban com note 658637476 下载地址 http www qsch
  • 在Windows下搭建Gitlab服务器

    一 GitLab简介 GitLab 是一个用于仓库管理系统的开源项目 使用Git作为代码管理工具 xff0c 并在此基础上搭建起来的web服务 可通过Web界面进行访问公开的或者私人项目 它拥有与Github类似的功能 xff0c 能够浏览
  • 浅谈Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer

    前言 xff1a 其实 studio3 0的工具大家也已经使用过一段时间了 xff0c 自己呢 xff0c 就是从bate版开始使用的 xff0c 我觉得比较好用的几个地方 就几个 xff0c 可能还没用到其他的精髓 但我觉的这个两个功能对
  • 在同一台电脑下如何进行 Python 2 与 3 的切换?

    裝兩個比如路徑 D python27 D python35 然後去手動把 python27下面的python exe改成python2 exe python35下面的python exe改成python3 exe然後你的腳本第一行就加上類似
  • Qt打开外部exe,并将其嵌入到qt界面中

    我现在需要用QProcess打开外部exe xff0c 并打开的外部界面嵌入到Qt的UI界面中 xff0c 请问大神们怎样能实现此功能 xff1f 谢谢啦 Qt打开外部exe已经实现 xff0c 不过是一个独立的窗口 xff0c 现在我需要
  • Gym render_modes = env_creator.metadata[“render_modes“]KeyError: ‘render_modes‘ 解决方案

    问题描述 今天在运行一行代码时 xff1a FLAGS env是我自己定义的环境 env 61 gym make FLAGS env 出现了这种错误 xff1a env 61 gym make FLAGS env File 34 lib p
  • dpkg包管理

    dpkg info xxx deb grep Depends 查看包的依赖关系 dpkg c xxx deb 安装前根据deb文件查看 dpkg L debname 安装后根据包名查看 dpkg l grep debname 查看是否安装某
  • 单片机烧录程序后没反应

    勾选reset and run 或者烧录完之后重新上电
  • CDN缓存

    CDN缓存那些事 CDN是什么 xff1f 谈到CDN的作用 xff0c 可以用8年买火车票的经历来形象比喻 xff1a 8年前 xff0c 还没有火车票代售点一说 xff0c 12306 cn更是无从说起 那时候火车票还只能在火车站的售票