
本文概述了从用户浏览器到CDN边缘节点的缓存流程,解释各层缓存的关键控制点与常见坑位,并给出可立即落地的优化方法,帮助提升整体CDN缓存的高命中率与体验稳定性。
要提高高命中率,先判断哪些资源值得缓存:静态资源(JS/CSS、图片、字体)通常应长期缓存,动态内容则视业务分层处理。合理设置TTL和区分可缓存/不可缓存的对象能最大化命中。不要盲目缓存所有内容,缓存无状态且共享的资源能显著提升边缘命中率,而频繁变化且用户特定的内容适合短TTL或走回源。
关键缓存头包括Cache-Control(max-age、public/private、s-maxage、stale-while-revalidate)、Pragma、Expires、ETag与Last-Modified。对于CDN,优先使用Cache-Control: public, s-maxage=... 来控制边缘节点;用ETag或Last-Modified做条件请求降级回源。浏览器端用max-age控制本地命中,边缘节点使用s-maxage覆盖origin策略。
边缘节点的配置要从缓存键、请求过滤和TTL三方面着手。统一缓存键(忽略无意义query参数、去掉User-Agent或Cookie等个性化字段)能合并请求;对于需要鉴权的静态资源可通过路径或签名区分;设置适度长期TTL并结合版本化URL(比如文件名带hash)来避免频繁失效;启用stale-while-revalidate可以在回源时仍返回旧内容,减少丢失命中。
观察点包括CDN控制台的统计(HIT/MISS比、回源流量、请求数)、边缘日志(边缘响应码、缓存命中标识)、原始服务器日志(回源的请求量)和真实用户监控(RUM)的数据。定期导出分析后,可按资源类型、路径、响应头判断瓶颈。结合报警(如回源流量突增)能及时定位配置误差或缓存击穿。
浏览器缓存和边缘节点缓存在控制上各有优先,若origin返回的头部不一致会造成冲突:例如浏览器设置短TTL但CDN设置长TTL,用户重复请求可能命中浏览器而不触发边缘统计,或浏览器不缓存但CDN已有缓存却被回源覆盖。解决思路是由origin统一策略,使用s-maxage区分边缘和浏览器行为,并通过Vary头正确标注响应差异。
实践建议:1) 静态资源采用版本化文件名并设置长期TTL;2) 剥离无关Cookie和鉴权头,使用子域名提供静态资源;3) 标准化查询参数,忽略无用参数或将其归一化;4) 使用s-maxage和stale-while-revalidate改善边缘体验;5) 预热关键路径缓存(Cache Warming)并设置合理的回源限速与降级策略;6) 监控并按资源分配TTL,结合A/B测试验证命中率与用户体验的平衡。