前言

今天在修改网站后,上传文件的时候。因为我是用脚本自动清理缓存的,所以Edgeone会自动将之前的文件标记过期。

而这就出现了一个问题,就是有些缓存并没有清除掉,如下图。

新网站

旧网站

明明已经更换了网站,但是因为缓存并没有清理掉,所以导致了用户访问到的是旧的网站。

那标记过期和直接删除有什么区别?

区别

标记过期(invalidate)

工作原理:

  • 将缓存标记为”已过期”状态,但不会立即删除
  • 用户下次访问时,EdgeOne 会向源站发送条件请求(携带 If-None-MatchIf-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"]
};

建议

  • 常规内容更新:使用标记过期,减少对源站的压力
  • 网站改版/紧急修复:使用直接删除,确保用户立即看到新内容
  • 自动化部署脚本:建议配置为直接删除,避免缓存不一致问题