后台把品牌说明从 A 改成 B,REST 立即返回 B,GraphQL 仍是 A;清全站缓存后恢复。这个对比已经说明数据保存没问题,缺的是精准失效。

我先用完全相同的 query 连续请求并记录响应头,再换 SKU、Store 和客户组。结果显示自定义字段被缓存,却没有关联到品牌实体的 cache tag。

Identity必须描述“这段结果依赖谁”

Resolver 返回品牌说明,它不仅依赖产品,还依赖品牌实体。只返回产品 ID 的 Identity,保存品牌时就不会让这份 GraphQL 结果失效。实现 Identity 时使用实体本身定义的缓存标签格式,避免自己拼出一个永远没人清理的字符串。

另一个维度是上下文:字段若按 Store View、客户组或币种变化,缓存键也要区分这些上下文。Identity负责实体变更失效,context负责不同请求之间不串数据,二者不能互相替代。

# 复现时保存两次响应与缓存头
curl -sS -D headers-1.txt -o body-1.json https://shop.example.com/graphql ...
curl -sS -D headers-2.txt -o body-2.json https://shop.example.com/graphql ...

修复后更新品牌实体,只清对应 tag,旧查询应返回 B;另一个无关品牌仍可保持命中。再用两个 Store 与两个客户组交叉测试,防止为了修“旧值”引入跨站或跨客户价格泄漏。