先给结论:多层缓存返回不同版本,通常不是“某一层坏了”,而是同一请求在不同层命中了不同缓存键或不同刷新时间。定位时不要从最外层逐层清缓存,而要先固定一个URL和一组请求头,记录每一层实际返回的版本标识,再决定是保留现有分层、改写缓存键,还是退出某一层缓存。只有拿到各层版本证据,取舍才有依据。
多层缓存常见结构是:浏览器缓存、CDN或反向代理缓存、应用层对象缓存、页面静态化缓存。它们可能各自保存了同一页面的不同时间点副本。直接全部清除会让问题暂时消失,但无法说明是哪一层在返回旧版本,下一次发布仍会复现。
可执行的动作是:为每个响应加一个可区分的版本标记,例如页面生成时间、内容哈希或构建号,并让各层原样透传,不要在其中一层重写。然后用同一URL、同一请求头连续请求,记录每层返回的标记。如果最外层标记新、回源标记旧,说明问题在内层;如果各层标记都不同,说明缓存键或刷新策略不一致。这个记录结果直接决定下一步是改键、改刷新顺序,还是放弃某一层缓存。
三种处理各有成立条件,不必全部采用。
版本不一致有几类常见原因,可以用不同证据区分:
注意,请求量下降或某层命中率归零,不能单独证明处理正确,也可能是流量转移、键变更或监控口径变化。需要结合版本标记是否收敛来判断。
假设某站点有CDN层和应用层缓存,发布后部分用户看到旧页。为每页加入构建号后连续请求,发现CDN返回新构建号,应用层返回旧构建号。此时保留分层、只调整刷新顺序即可:先失效应用层,再失效CDN层。若发现两层构建号相同但内容仍不同,则说明键或内容维度不一致,应转向改写缓存键,而不是继续清缓存。
无论选择保留、改写还是退出,都应把版本标记透传、缓存键规则、失效顺序写成可复现的检查项。这样下一次出现版本差异时,可以直接比对各层标记,而不必重新猜测。若涉及具体平台或工具的支持情况,需分别核查其文档,不能假设各层行为一致。最终判断标准是:同一请求在各层返回同一版本,且这一结果可重复验证。