什么是 CDN?为什么它可以做缓存?


面试考察点

  1. 基础概念掌握度:面试官不仅仅是想知道 CDN 的全称和定义,更是想确认你是否理解 CDN 解决的核心问题——网络延迟和源站压力,以及它是如何从架构层面来解决这些问题的。

  2. 缓存原理理解:考察你是否理解 CDN 缓存的底层机制,包括缓存命中、缓存过期、缓存更新等关键流程,而不是只笼统地知道 "CDN 能缓存静态资源"。

  3. 架构设计思维:看你能否从全局视角理解 CDN 在整个系统架构中的定位,以及何时该用 CDN、何时不该用。

核心答案

CDN(Content Delivery Network,内容分发网络)是一种分布式服务器网络,核心思路就是把内容缓存到离用户最近的边缘节点上,让用户就近获取数据,而不是每次都跑到源站(origin server)去拿。

为什么 CDN 能做缓存?一句话概括:CDN 的边缘节点本质上就是一个反向代理缓存服务器,它拦截用户请求,如果本地有缓存且未过期就直接返回,没有才回源。这个机制和浏览器缓存、Nginx 缓存本质上是一回事,只是 CDN 把缓存节点部署到了全球各地的机房里。

上图展示了 CDN 的核心工作流程,整体分为三个层次:

  • 用户层:分布在不同地域的用户发起请求,DNS 会将请求解析到最近的边缘节点。

  • 边缘节点层:每个边缘节点维护自己的本地缓存。用户请求先到边缘节点,如果缓存命中(且未过期),直接返回数据,响应时间通常在毫秒级。如果缓存未命中,边缘节点会代替用户去源站拉取资源,拿到后缓存一份,再返回给用户。

  • 源站层:真正的业务服务器,只在边缘节点没有缓存时才会被访问。CDN 的核心价值就是把绝大多数请求拦截在边缘节点,源站的 QPS 能降低 90% 以上。

关键点在于:没有 CDN 的时候,所有用户都直接访问源站,距离远、延迟高、源站压力大;有了 CDN 之后,每个用户就近访问边缘节点,延迟低、速度快、源站轻松了。

深度解析

一、CDN 能做缓存的技术原理

很多人知道 CDN 能缓存,但说不清楚具体是怎么实现的。其实 CDN 的缓存机制依赖几个核心技术:

1. DNS 智能解析(GSLB)

CDN 能让用户访问到 "最近的" 节点,靠的是 GSLB(Global Server Load Balancing,全局负载均衡)。当用户访问一个接入了 CDN 的域名时:

  • 用户发起 DNS 解析,比如 static.example.com
  • DNS 查询到的是 CDN 的权威 DNS,而不是源站的 IP
  • CDN 的 GSLB 根据用户的 IP 地址、各边缘节点的负载情况,返回一个最优的边缘节点 IP
  • 用户直接向这个边缘节点发起请求

这就是为什么北京用户和上海用户访问同一个域名,拿到的 IP 不一样。

2. 缓存命中与回源

边缘节点收到请求后,处理逻辑非常类似一个缓存代理:

步骤动作说明
1接收请求边缘节点收到用户请求
2查找缓存根据请求的 URL 查找本地缓存
3a缓存命中直接返回缓存内容,附加 X-Cache: HIT 响应头
3b缓存未命中向源站发起请求,获取内容后缓存并返回
4缓存过期如果缓存已过期,向源站验证(304)或重新拉取

你可以通过响应头里的 X-Cache 字段判断是否命中了 CDN 缓存:HIT 表示命中,MISS 表示未命中。

3. 缓存过期与刷新策略

CDN 的缓存时效不是随便定的,主要依赖 HTTP 协议里的缓存控制头:

  • Cache-Control: max-age=3600——资源在 3600 秒内被视为新鲜,直接用缓存
  • Expires——指定绝对过期时间(HTTP/1.0 的老方案,优先级低于 Cache-Control
  • ETag / Last-Modified——缓存过期后,用这些头做条件请求,如果源站资源没变就返回 304 Not Modified,省带宽

我在实际项目中踩过一个坑:更新了静态资源但 CDN 缓存没刷新,用户看到的还是老版本。后来我们的方案是给静态资源文件名加 hash 指纹(比如 app.a3b2c1.js),每次更新文件名都变了,自然就不会命中旧缓存了。这也是现在前端工程化的标配做法。

二、CDN 适合缓存什么?不适合缓存什么?

这个面试官特别爱追问,因为它考察的是你对业务场景的理解。

适合缓存不适合缓存
静态资源(JS、CSS、图片、字体)实时性要求高的接口(股票行情)
大文件下载(安装包、视频)用户个性化数据(个人中心页面)
直播/点播视频流频繁变更的动态数据
不常变更的 API 响应(商品详情页)涉及敏感操作的交易请求

说白了,读多写少、更新频率低、对实时性要求不高的内容,都适合放 CDN。

三、CDN 缓存 vs 浏览器缓存 vs Nginx 缓存

面试中经常让你对比这几种缓存,区别在哪?

对比维度浏览器缓存CDN 缓存Nginx 本地缓存
缓存位置用户本地CDN 边缘节点源站同机房的代理层
服务范围仅当前用户同区域的所有用户所有经过该 Nginx 的用户
网络延迟最低(本地读取)低(就近机房)中(需到源站机房)
缓存命中率取决于单个用户高(大量用户共享)较高
源站保护无(缓存未命中直接打源站)强(拦截大部分请求)中等

一个完整的链路是:用户请求 → 浏览器缓存 → CDN 边缘节点缓存 → Nginx 缓存 → 源站。每一层都挡住一部分请求,最终到源站的请求量就很小的。

面试高频追问

  1. CDN 缓存和浏览器缓存有什么区别?

    浏览器缓存是用户本地的,只对当前用户有效;CDN 缓存在边缘节点上,对该区域内所有用户共享。浏览器缓存未命中直接打源站,CDN 缓存未命中是 CDN 节点去回源,用户感知不到。打个比方,浏览器缓存是你自己冰箱里的存货,CDN 缓存是你小区门口便利店的存货。

  2. 如何解决 CDN 缓存更新不及时的问题?

    三种方案:一是文件名加 hash 指纹(推荐);二是主动调用 CDN 服务商的缓存刷新 API;三是缩短 max-age,但这会增加回源频率,需要权衡。

  3. CDN 是怎么防止被盗链的?

    常见手段包括:Referer 鉴权(检查请求来源)、IP 黑白名单URL 签名/鉴权(生成带过期时间的加密 URL)、回源鉴权。生产环境中 URL 签名方案用得最多,比如视频网站的播放链接通常带有 token 参数,过期就失效。

常见面试变体

  • "CDN 的回源机制是什么?什么情况下会回源?"
  • "CDN 是如何实现就近访问的?"
  • "CDN 缓存和 Redis 缓存有什么区别?各适合什么场景?"
  • "如何设计一个高可用的静态资源分发方案?"

记忆口诀

CDN 缓存四要素就近缓存响应快,DNS 智能来调度,缓存未命中才回源,源站压力自然降。

记住一个链路:用户 → 浏览器 → CDN 边缘 → Nginx → 源站,越往后请求越少。

总结

CDN 的核心价值就是 "就近缓存 + 智能调度",通过在全球各地部署边缘缓存节点,配合 DNS 智能解析,让用户拿到最近的缓存数据。面试中抓住 GSLB 调度、缓存命中/回源机制、HTTP 缓存控制头 这三条主线,再结合静态资源 hash 指纹、防盗链等实际经验,就能把这道题答得比较扎实。