SuperAPI AI 工具集

cache-invalidation

设计与创作

查看项目

更新于 10-15 22:19

技能介绍

用途:为数据一致性设计并实现缓存失效策略,处理陈旧数据、更新时失效与缓存流程设计。

主要能力:

  • 三种失效模式:事件驱动失效(写入频率低、一致性要求严格或扇出有界时)、标签失效(一个实体变更影响多个相关键时)、stale-while-revalidate(可接受最终一致性、读量大且陈旧代价低时)。三者可组合,例如 CDN 边缘用 SWR、应用层用事件驱动。
  • 提供了基于 Redis 的标签失效实现,以及标签集合死键与增长的处理思路。
  • 提供了 Next.js/Vercel 边缘缓存标签用法(fetch 的 next.tags 配合 next/cache 的 revalidateTag),以及 Cloudflare Cache-Tag 头部与通过 API 按标签清除的说明(Cache-Tag 为 Enterprise 功能,低版本按 URL 清除)。
  • 提供了 HTTP Cache-Control 与 Redis 应用层 SWR 的用法示例。
  • 列出了若干失败模式:缓存击穿/惊群(概率提前过期或按 key 加锁)、负缓存、副本延迟导致的失效空洞、多实例下的进程内缓存。

必要用法:

  • 先做发现:明确缓存内容(每用户与共享、聚合计算、关系数据)、缓存位置(进程内、共享 Redis/Memcached、HTTP/CDN、客户端)、写入模式(谁写、频率、是否事务)、可接受的一致性级别(严格、最终、读己所写)。
  • 事件驱动实现中,必须在提交后失效,不能在提交前或提交中。
  • 扇出失效需显式枚举键;通配模式使用 SCAN 加管道删除,生产环境不要用 KEYS。
  • 跨服务边界一致时可用事务性 outbox:同一事务写数据库与 outbox 表,后台 worker 读取并触发失效,保证至少一次失效。Redis 标签实现中,可用管道 set 值并 sadd 到 tag:name,标签集合 TTL 设为值 TTL 的两倍,避免死键无界增长。
  • Next.js 可在 fetch 时打标签,在 server action 或路由处理器中用 revalidateTag 清除。
  • Cloudflare 可按 Cache-Tag 头部并调用 POST /zones/{zone}/purge_cache 带 tags 清除。
  • SWR 将 TTL 分为 fresh 与 stale 两段,示例为 Cache-Control: max-age=60, stale-while-revalidate=300。

适用场景:需要处理陈旧数据、更新时缓存失效、设计缓存流程、以及读多写少等场景。

限制与注意事项:安全相关数据(权限、定价、库存)、高写入实体、必须准确的聚合计数/余额不适合 SWR;进程内缓存在多实例下不可见,需共享缓存或接受并记录 TTL 窗口;失效后立即读副本可能重新填充陈旧数据,可路由到主库或等待延迟过去;标签集合可能包含死键,需设置更长 TTL 或定期清理。