用途:为 TanStack AI 提供基于普通 Redis 的生产级记忆适配器(recall/save),不要求向量索引,排序在客户端完成,结合词法、可选余弦相似度、时效性与重要性。
主要能力:自带 Redis 客户端即可使用。ioredis 可直接接入;node-redis v4+ 需通过 fromNodeRedis 包装(其 camelCase API 会被转换为小写的 RedisLike 形状),直接传原始 node-redis 客户端会抛出 client.sadd is not a function。redis() 接受与 inMemory() 相同的 topK、minScore、kinds、embedder、extract 选项。
存储模型:记录写入 {prefix}:record:{id}(JSON),并按作用域加入索引集合 {prefix}:index:{tenantId 或 _}:{userId 或 _}:{threadId}。作用域值中的 :、\ 与 _ 会被转义,避免分隔符或未设置占位符造成作用域冲突。
使用方式:用 ioredis 时可写 const client = new Redis(process.env.REDIS_URL ?? 'redis://localhost:6379'); const memory = redis({ redis: client, prefix: 'myapp:memory' })。用 node-redis 时先 createClient 并 connect,再传 fromNodeRedis(client)。作用域应来自服务端已校验的会话,绝不能取自 req.body。
限制与注意:没有对旧索引布局的双读兼容,若此前用了不同的键结构(如缺少 tenantId),需重新索引或清空,旧键会被孤立。读写必须传入相同的 tenantId/userId/threadId;省略可选维度会变成 _,省略不等于“匹配任意”。召回会把该作用域全部记录加载进 Node 打分,单作用域约 1 万条以内较合适,超出应改为感知向量索引的适配器。排查:跨进程不可见时确认 REDIS_URL 与 prefix 一致;JSON 解析失败的行在读取时跳过且保留不删,每个坏 id 会有一次 console.warn,可修复或删除对应 {prefix}:record:{id} 键。