5月30日 20:38
MCP 数据持久化和缓存策略该怎么设计?
MCP 的持久化和缓存不能只理解成“把数据存起来”。先区分哪些数据必须长期保留,哪些只是为了减少重复计算:工具定义、资源索引、用户会话、授权状态通常需要持久化;工具调用结果、资源快照、schema 解析结果更适合缓存。分清这条线,才不会把缓存当数据库,也不会把数据库拖成临时变量仓库。
追问
MCP 哪些数据一定要持久化?
工具清单、资源元数据、授权状态和会话恢复信息最好持久化,因为它们影响协议行为和用户体验。单次工具调用中间结果不一定落库,除非要审计或断点续跑。
Redis 缓存和数据库版本怎么配合?
关键记录带 version 或 updatedAt,缓存 key 或 value 里也保存这个版本。读取时发现版本不一致就丢弃缓存,这比单纯依赖 TTL 更可靠。
持久化会带来哪些安全边界?
不要把 access token、用户输入的敏感资源和工具返回原文无脑落库。确实要保存时,应加密、设置保留周期,并在日志里只记录 request id。
缓存最常见的坑是什么?
权限变化后缓存没失效,可能导致用户还能看到旧资源;失败结果缓存太久,也会让故障恢复后仍然返回错误。
单机和多实例有什么取舍?
单机可以用 SQLite 加内存缓存;多实例必须把会话和缓存外置到 Redis 或数据库,否则请求打到不同实例时会状态丢失。
写段代码
tsasync function getToolSchema(name: string) { const key = `mcp:schema:${name}`; const cached = await redis.get(key); if (cached) return JSON.parse(cached); const schema = await store.loadToolSchema(name); await redis.set(key, JSON.stringify(schema), { EX: 300 }); return schema; }