在线 Java 面试刷题(已更新241题,图文并茂):https://www.quanxiaoha.com/java-interview
面试考察点
基础概念掌握度:面试官不仅仅是想知道 CDN 的全称和定义,更是想确认你是否理解 CDN 解决的核心问题——网络延迟和源站压力,以及它是如何从架构层面来解决这些问题的。
缓存原理理解:考察你是否理解 CDN 缓存的底层机制,包括缓存命中、缓存过期、缓存更新等关键流程,而不是只笼统地知道 "CDN 能缓存静态资源"。
架构设计思维:看你能否从全局视角理解 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.comDNS 查询到的是 CDN 的权威 DNS,而不是源站的 IP
CDN 的 GSLB 根据用户的 IP 地址、各边缘节点的负载情况,返回一个最优的边缘节点 IP
用户直接向这个边缘节点发起请求
这就是为什么北京用户和上海用户访问同一个域名,拿到的 IP 不一样。
加入小哈的星球,你将获得:专属的项目实战(4个项目) / 1v1 提问 / 简历修改 /Java 学习路线 /社群讨论 /学习打卡 / 每月赠书
《仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/
《Spring AI 应用(RAG 智能客服)》已完结, 基于 Spring AI + Spring Boot 3.x + JDK 21
《秒杀系统设计》正在更新中,单体到微服务高并发架构演进
《前后端分离博客项目(全栈开发)》已完结,演示链接:http://116.62.199.48/
项目阅读地址:https://quanxiaoha.com/column
截止目前,累计输出 120w+ 字,讲解图 4013+ 张,还在持续爆肝中..戳我加入学习,解锁全部项目,已有4500+小伙伴加入
2. 缓存命中与回源
边缘节点收到请求后,处理逻辑非常类似一个缓存代理:
步骤 | 动作 | 说明 |
|---|---|---|
1 | 接收请求 | 边缘节点收到用户请求 |
2 | 查找缓存 | 根据请求的 URL 查找本地缓存 |
3a | 缓存命中 | 直接返回缓存内容,附加 |
3b | 缓存未命中 | 向源站发起请求,获取内容后缓存并返回 |
4 | 缓存过期 | 如果缓存已过期,向源站验证( |
你可以通过响应头里的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 缓存 → 源站。每一层都挡住一部分请求,最终到源站的请求量就很小的。
面试高频追问
CDN 缓存和浏览器缓存有什么区别?
浏览器缓存是用户本地的,只对当前用户有效;CDN 缓存在边缘节点上,对该区域内所有用户共享。浏览器缓存未命中直接打源站,CDN 缓存未命中是 CDN 节点去回源,用户感知不到。打个比方,浏览器缓存是你自己冰箱里的存货,CDN 缓存是你小区门口便利店的存货。
如何解决 CDN 缓存更新不及时的问题?
三种方案:一是文件名加 hash 指纹(推荐);二是主动调用 CDN 服务商的缓存刷新 API;三是缩短
max-age,但这会增加回源频率,需要权衡。CDN 是怎么防止被盗链的?
常见手段包括:Referer 鉴权(检查请求来源)、IP 黑白名单、URL 签名/鉴权(生成带过期时间的加密 URL)、回源鉴权。生产环境中 URL 签名方案用得最多,比如视频网站的播放链接通常带有
token参数,过期就失效。
常见面试变体
"CDN 的回源机制是什么?什么情况下会回源?"
"CDN 是如何实现就近访问的?"
"CDN 缓存和 Redis 缓存有什么区别?各适合什么场景?"
"如何设计一个高可用的静态资源分发方案?"
记忆口诀
CDN 缓存四要素:就近缓存响应快,DNS 智能来调度,缓存未命中才回源,源站压力自然降。
记住一个链路:用户 → 浏览器 → CDN 边缘 → Nginx → 源站,越往后请求越少。
总结
CDN 的核心价值就是 "就近缓存 + 智能调度",通过在全球各地部署边缘缓存节点,配合 DNS 智能解析,让用户拿到最近的缓存数据。面试中抓住GSLB 调度、缓存命中/回源机制、HTTP 缓存控制头这三条主线,再结合静态资源 hash 指纹、防盗链等实际经验,就能把这道题答得比较扎实。
加入小哈的星球,你将获得:专属的项目实战(4个项目) / 1v1 提问 / 简历修改 /Java 学习路线 /社群讨论 /学习打卡 / 每月赠书
《仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/
《Spring AI 应用(RAG 智能客服)》已完结, 基于 Spring AI + Spring Boot 3.x + JDK 21
《秒杀系统设计》正在更新中,单体到微服务高并发架构演进
《前后端分离博客项目(全栈开发)》已完结,演示链接:http://116.62.199.48/
项目阅读地址:https://quanxiaoha.com/column
截止目前,累计输出 120w+ 字,讲解图 4013+ 张,还在持续爆肝中..戳我加入学习,解锁全部项目,已有4500+小伙伴加入
1. 我的私密学习小圈子,从0到1手撸企业实战项目~ 2. 面试官:YoungGC 和 FullGC 的触发条件是什么? 3. 百度面试官:RabbitMQ 如何防止重复消费?5种解决方案,你知道几个? 4. 面试被拷打:什么是 TCP 的粘包、拆包问题?我:了解这个,有嘛用?
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀,谢谢啦