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


一则或许对你有用的小广告

欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书

  • 《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于 Spring AI + Spring Boot 3.x + JDK 21...查看介绍

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...查看介绍;演示链接:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/

  • 新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍

截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观

面试考察点

  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 指纹、防盗链等实际经验,就能把这道题答得比较扎实。