用途:在 packages/utils/ 及各子项目中实现和优化 Redis 缓存。适用场景包括为昂贵的数据库查询加缓存、给 API 端点添加缓存层、排查缓存命中/未命中问题、实现失效策略、优化 TTL、设置缓存预热、管理缓存键与命名空间。
架构:项目使用 Upstash Redis 的集中式客户端,定义在 packages/utils/src/redis.ts,需配置环境变量 UPSTASH_REDIS_REST_URL 与 UPSTASH_REDIS_REST_TOKEN,并通过 packages/utils/src/index.ts 导出 redis;具体缓存实现位于 apps/api/src/lib/cache/ 下的 cars.ts、coe.ts、posts.ts。
主要能力:基础 get/set、带过期时间({ ex: 秒 })写入、setnx;对象需 JSON.stringify/parse 序列化,可结合泛型实现类型安全。常用策略有 Cache-Aside(先查缓存再查库并回填)、Write-Through(写库同时更新缓存并使列表缓存失效)。失效支持按单键、多键删除,按模式删除需谨慎(keys 属昂贵操作)。键命名建议统一前缀与命名空间,并区分实体、列表、聚合、用户与会话键。TTL 可按数据变化频率分级(如 60 秒到 30 天),也可按时间段动态调整。高级模式包括用 setnx 加锁防止缓存击穿、stale-while-revalidate、内存 L1 加 Redis L2 的分层缓存、基于 @upstash/ratelimit 的滑动窗口限流、以及启动或定时任务中的缓存预热。
使用与限制:所有对象必须序列化后再写入,否则不可用;应始终设置 TTL,避免缓存无限增长;写操作后需同步失效相关缓存,防止脏数据;应对 Redis 故障做优雅降级;建议监控命中率并编写缓存逻辑测试(示例使用 vitest 并 mock redis)。按模式批量删除开销较大,应谨慎使用。资料未提供具体性能指标、收费信息及与其他缓存方案的对比。