概述
读穿缓存的价值取决于键的正确性与失效的完整性。键必须包含租户或用户维度,否则会跨作用域串数据;失效之外还需一个短 TTL 兜底,避免漏掉的失效长期存在。
关键步骤
- 用规范化查询加租户或用户作用域构造缓存键。
- 读穿缓存:命中则返回,未命中则查询并写入。
- 写入时对受影响数据失效,并以短 TTL 作为兜底。
- 记录命中率与延迟,确认缓存确有收益。
验证
- 重复读取不再访问数据库。
- 不同租户不会共享缓存条目。
- 写入后结果被刷新。
- 漏掉失效的条目在 TTL 后消解。
注意事项
- 结果缓存会短暂提供陈旧数据,对必须精确的读取不适用。
- 缓存键与失效增加复杂度与缺陷,应度量清楚后再广泛缓存。
适用范围
本条目围绕「为昂贵查询添加读穿缓存」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
const key = `q:${tenant}:${hash(normalizedSql)}`;
const cached = await cache.get(key);
if (cached) return JSON.parse(cached);
const rows = await db.query(sql);
await cache.set(key, JSON.stringify(rows), { ttl: 300 });
return rows;