前言
今天在修改网站后,上传文件的时候。因为我是用脚本自动清理缓存的,所以Edgeone会自动将之前的文件标记过期。
而这就出现了一个问题,就是有些缓存并没有清除掉,如下图。


明明已经更换了网站,但是因为缓存并没有清理掉,所以导致了用户访问到的是旧的网站。
那标记过期和直接删除有什么区别?
区别
标记过期(invalidate)
工作原理:
- 将缓存标记为”已过期”状态,但不会立即删除
- 用户下次访问时,EdgeOne 会向源站发送条件请求(携带
If-None-Match和If-Modified-Since头部) - 如果源站返回 304 Not Modified,则继续使用旧缓存
- 如果源站返回 200,则拉取新内容并更新缓存
特点:
- ✅ 对源站压力较小(可能不需要重新传输内容)
- ❌ 生效有延迟(依赖用户访问触发)
- ❌ 如果源站响应异常,可能继续返回旧内容
- 适用于:内容更新不频繁、希望减少源站压力的场景
直接删除(delete)
工作原理:
- 立即从 EdgeOne 节点删除缓存文件
- 用户下次访问时,强制回源获取最新内容
- 不校验缓存是否过期,直接删除
特点:
- ✅ 立即生效,确保用户获取最新内容
- ✅ 不受源站 304 响应影响
- ❌ 对源站压力较大(所有请求都回源)
- 适用于:网站改版、紧急更新、需要立即生效的场景
对比总结
| 特性 | 标记过期(invalidate) | 直接删除(delete) |
|---|---|---|
| 生效速度 | 较慢(需用户触发) | 立即生效 |
| 源站压力 | 较小 | 较大 |
| 缓存处理 | 标记为过期 | 立即删除 |
| 回源行为 | 条件请求(可能 304) | 强制回源(200) |
| 适用场景 | 常规更新 | 紧急更新、改版 |
为什么我之前遇到问题?
因为我使用的是 标记过期 方式,当源站响应异常或返回 304 时,EdgeOne 会继续使用旧的缓存,导致用户看到旧版网站。
解决方案
如果你和我一样用的脚本来清理缓存,那么你需要在脚本中添加一个参数:Method
const params = {
"ZoneId": "zone-xxx",
"Type": "purge_host",
"Method": "delete", // 直接删除
"Targets": ["blog.xrbk.cn"]
};
建议
- 常规内容更新:使用标记过期,减少对源站的压力
- 网站改版/紧急修复:使用直接删除,确保用户立即看到新内容
- 自动化部署脚本:建议配置为直接删除,避免缓存不一致问题