这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
缓存一致性与版本化
最常见的问题
CDN 最常见的问题是缓存一致性:用户更新头像后,边缘节点里还是旧头像,刷新也没用。
问题的根源:CDN 缓存的是「URL → 内容」,URL 没变,它不知道内容已经变了。
两类解法
| 方案 | 做法 | 特点 |
|---|---|---|
| 刷新缓存 | 主动调用 CDN 刷新接口,删除旧内容 | 有延迟、可能漏、有成本 |
| 版本化 URL | 内容变化后生成新 URL | 稳定、可控、可长缓存 |
版本化通常更稳
对文件系统来说,版本化通常比频繁刷新更稳定:
头像 v1: /avatars/{user_id}/v1.jpg?v=hash1
头像 v2: /avatars/{user_id}/v2.jpg?v=hash2
只要文件内容不可变,同一个 URL 永远对应同一个对象,CDN 就可以放心长时间缓存,完全不用管刷新。
这就是「对象内容不可变」原则的延伸:上传时给文件一个内容寻址的 key(如带 hash),内容变 → key 变 → URL 变,缓存自然一致。
什么情况必须刷新
有些场景没法用版本化(URL 不能变),只能刷新:
- 临时文件、被替换的固定路径资源。
- 权限变化后需要立即失效的缓存。
- 审核驳回、删除后要快速撤下的内容。
刷新要有审计(谁、何时、哪些 URL),并且要能批量、能失败重试。
缓存时间怎么设
- 不可变内容:
Cache-Control: public, max-age=31536000, immutable(一年)。 - 可能变的内容:较短的
max-age+ 必须ETag/Last-Modified校验。 - 私有文件:不缓存,或只缓存签名有效期内的内容。
一句话
缓存一致性没有银弹:内容不可变就用版本化,URL 不能变就刷新。文件系统优先保证内容不可变,是省掉大部分缓存问题的根本办法。
下一节看私有文件怎么在 CDN 上安全访问。
发现内容有问题?
告诉我们哪里需要改进。
