← 中文资源

简体中文版本

为昂贵查询添加读穿缓存

按规范化查询加租户作为键缓存结果,写入时失效,并设置 TTL,使漏掉的失效也能在有限时间内消解。

阅读英文原文

概述

读穿缓存的价值取决于键的正确性与失效的完整性。键必须包含租户或用户维度,否则会跨作用域串数据;失效之外还需一个短 TTL 兜底,避免漏掉的失效长期存在。

关键步骤

  1. 用规范化查询加租户或用户作用域构造缓存键。
  2. 读穿缓存:命中则返回,未命中则查询并写入。
  3. 写入时对受影响数据失效,并以短 TTL 作为兜底。
  4. 记录命中率与延迟,确认缓存确有收益。

验证

  • 重复读取不再访问数据库。
  • 不同租户不会共享缓存条目。
  • 写入后结果被刷新。
  • 漏掉失效的条目在 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;