SuperAPI AI 工具集

staff-engineering-skills-cache-invalidation

编程与开发

查看项目

更新于 10-16 04:31

技能介绍

用途:这是一份面向工程实践的缓存失效技能文档,核心目标是防止因缓存未失效或失效不完整而产生的脏数据缺陷。它强调一个基本问题:缓存是源数据的副本,副本会与源数据产生分歧,因此每个缓存都带来一致性义务——源数据变化时,必须更新或丢弃副本。若无法回答“这个缓存如何得知源数据已变化”,就不是缓存策略,而是带可变延迟的脏数据缺陷。

主要能力:文档梳理了多层缓存层级(浏览器缓存、CDN、反向代理、应用缓存如 Redis 与内存 Map、ORM/查询缓存),指出失效一层不等于失效其他层,并给出各层的控制方式、失效手段与风险。它列出创建脏缓存的检测信号,例如读路径有 cache.set() 而写路径无 cache.delete()、用无上限的 Map 作缓存、对权限等安全敏感数据仅靠 TTL、对可变数据设置 Cache-Control: max-age=86400、缓存键遗漏影响值的变量、应用层与 CDN 双缓存却只有一条失效路径、写路径绕过失效等。

使用方式:文档给出若干模式。内容寻址缓存以内容哈希作为键,内容变化即键变化,旧条目由 LRU 自然淘汰,无需失效。缓存旁路配合事件驱动失效,写穿(写入已知正确的新值)优于删除(删除后可能从滞后副本重新填充脏数据),TTL 仅作安全网,多实例本地缓存需 pub/sub 失效通道。内存缓存应使用带大小上限与 TTL 的 LRU,allowStale 可实现 stale-while-revalidate。单飞(single-flight)合并并发未命中请求以防缓存击穿,但仅限单进程,多实例需分布式锁或概率性提前过期。缓存键必须包含所有影响值的变量,如 locale、currency、userId、orgId、分页与排序参数。文档还给出“什么数据缓存在哪里”的对照表与反模式示例。

适用场景与限制:适用于添加 Redis、内存 Map、CDN、HTTP 缓存头等缓存层,或排查用户看到旧数据的场景。限制方面,文档为技能说明性质,未提供具体安装命令、收费或平台信息;示例代码为 TypeScript/JavaScript 片段,实际落地需结合自身技术栈。