CDN缓存命中率上不去?从缓存策略到预热刷新避坑指南
本内容发表于:2026-06-25 11:44:25
浏览量
1008

CDN缓存命中率上不去?从缓存策略到预热刷新避坑指南

微信图片_2026-06-25_114235_202.png

去年一个客户,CDN配好了,源站也稳了,但每次看控制台,命中率只有30%。源站带宽一直下不来,CDN费用也没省多少。他问我:“是不是我业务不行,缓存不起来?”

我看了他的配置,发现几个问题:缓存时间设太短,动态接口也被缓存了,URL里带了一堆随机参数,CDN把每个参数当成不同文件存。结果就是,缓存没效率,回源一大堆。

这是CDN优化最常见的误区:买了CDN,但没把缓存策略调好,等于只用了CDN的传输能力,没用上它的缓存能力。

01 先搞清楚命中率是怎么算的

缓存命中率,简单说就是“用户的请求有多少直接从CDN节点拿到了内容,不用回源”。

CDN数据流向:用户 → CDN的L1节点 → CDN的L2节点 → 源站

控制台显示的命中率,一般是L1节点的命中率。实际真实的命中率会比显示值略高,因为L1没命中的请求可能从L2拿到,不一定回源

一个小例子:一个加速域名有10个可访问的URL,其中1个源站设置了no-cache导致不缓存。其他9个URL都命中,命中率也只有90%。这个差距对单个文件来说看着小,但对流量大的站点,少了10%的命中率,源站带宽可能翻倍。

命中率低意味着什么:每次请求都从CDN回源,公网链路的不稳定会让加速效果大打折扣,源站压力也会增大

02 缓存策略:命中率的命根子

缓存时间设多久?

静态资源可以放长,比如一年。配合版本号(main.v123.css),更新时用新文件名,不用清缓存

动态资源不缓存,设成max-age=0。否则用户看到的是旧数据。

缓存规则有优先级:数值越大优先级越高。比如同时有全路径/test/*.jpg规则和.jpg后缀规则,优先级高的优先生效。配之前先检查优先级是不是对的。

注意源站缓存头:CDN默认会遵循源站返回的Cache-ControlPragma。如果源站设了no-cacheno-storemax-age=0,CDN就不会缓存。不想被源站头覆盖,可以关闭“缓存遵循源站”功能

03 忽略URL参数:别让随机参数搞死命中率

很多网站URL带参数:1.jpg?timestamp=123456。每次访问时间戳不同,CDN会当成不同文件去缓存。结果就是每次都回源,命中率接近0

解法:在CDN控制台开启“忽略参数”功能,CDN只缓存1.jpg,忽略后面的参数

但要注意:如果源站确实需要根据不同参数返回不同内容,就不能粗暴忽略。可以用“保留指定参数”功能,只忽略不影响内容的参数

04 预热和刷新:两个容易搞混的操作

预热:主动把资源从源站拉到CDN节点上。用户第一次访问就能命中,不回源

刷新:清除CDN节点上的旧缓存。用户下次访问时,CDN回源拿最新内容,重新缓存

什么时候先刷新再预热?:源站内容更新时,先刷新把旧缓存清掉,再预热把新内容提前拉上去

什么时候只预热?:首次接入CDN,节点上没有缓存,直接预热即可

注意:刷新会短暂降低命中率,预热会提高命中率。刷新后如果访问量大,命中率会有波动,通常是正常的。如果频繁刷新,命中率会持续走低

05 其他影响命中率的细节

文件热度不够:CDN节点空间有限,访问频率低的文件会被淘汰。流量本身不高的域名,命中率可能偏低,这跟文件热度有关。

Range回源:大文件开启Range回源可以分片传输,提高效率。但如果文件不大(10MB以下),开启反而增加回源请求,降低命中率

Vary头:如果源站返回Vary: Accept-Encoding,CDN会对不同编码分别缓存。这会增加缓存碎片,降低命中率

06 一个真实案例:命中率从30%提到85%

一个资讯网站,买CDN后命中率一直30%。排查发现:

  • 缓存时间只设了1小时,静态资源频繁过期

  • 参数没有忽略,导致大量重复缓存

  • 动态页面被缓存了,用户看到旧内容

调整后:

  • 图片/CSS/JS改缓存1年,配合版本号

  • 开启忽略参数

  • 动态内容不缓存

  • 大促前预热热门文章列表

次月命中率升到85%,源站带宽降了60%。运维负责人说:“以前觉得CDN就是快,现在才知道,缓存策略配好了,快和省能一起做到。”

写在最后

CDN缓存命中率不是天生的,是配置出来的。

那家客户的运维负责人后来总结:“静态资源放长缓存,动态内容不缓存,URL参数该忽略就忽略,预热和刷新分清再用,命中率自然就上来了。”

你的CDN命中率,现在是多少?今天就去控制台看看。