Story 010.002: system-config-redis-cache
Status
Completed
Story
As a 系统管理员,
I want 为系统配置模块添加Redis缓存支持,优化配置访问性能,
so that 可以显著减少数据库访问次数,提高系统配置读取效率
Acceptance Criteria
- 在系统配置服务中添加Redis缓存功能
- 实现缓存键格式:
system_config:{tenantId}:{configKey}
- 设置默认TTL为1小时
- 配置更新时自动清除相关缓存
- 实现缓存穿透保护机制
- 验证现有功能保持完整,无回归
Tasks / Subtasks
Dev Notes
技术栈信息 [Source: architecture/tech-stack.md]
- 运行时: Node.js 20.18.3
- 框架: Hono 4.8.5 (Web框架和API路由)
- 数据库: PostgreSQL 17 (通过TypeORM)
- ORM: TypeORM 0.3.25 (实体管理)
- 缓存: Redis 7.0.0 (会话管理和缓存)
项目结构信息 [Source: architecture/source-tree.md]
- 包位置:
packages/core-module-mt/system-config-module-mt/
- Redis工具位置:
packages/shared-utils/src/utils/redis.util.ts
- 现有模块参考:
packages/core-module-mt/file-module-mt/
Redis工具集成模式 [Source: packages/shared-utils/src/utils/redis.util.ts]
- 单例模式: 使用RedisUtil.getInstance()获取实例
- 连接管理: 自动连接和断开连接
- 键值操作: set/get/del方法支持TTL
- 错误处理: 内置错误处理机制
系统配置服务现有结构 [Source: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts]
- 继承模式: 继承GenericCrudService
- 租户配置: 通过tenantOptions配置租户隔离
- 用户跟踪: 通过userTracking配置用户跟踪
- 自定义方法: getConfigByKey, getConfigsByKeys, setConfig, deleteConfig等
- 参考文件: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts
缓存策略设计
- 缓存键格式:
system_config:{tenantId}:{configKey} [参考: docs/epic-010-system-config-multi-tenant.md]
- 默认TTL: 1小时 [参考: docs/epic-010-system-config-multi-tenant.md]
- 空值缓存: 短TTL (如5分钟) 防止缓存穿透
- 缓存预热: 系统启动时预加载常用配置
集成方法
- 依赖注入: 在SystemConfigServiceMt构造函数中注入RedisUtil
- 缓存优先: 先查询缓存,缓存未命中再查询数据库
- 写穿透: 数据更新时同步更新缓存
- 缓存清除: 配置更新时清除相关缓存
关键参考文件路径
测试
测试标准 [Source: architecture/testing-strategy.md]
- 测试框架: Vitest + hono/testing
- 测试位置:
packages/core-module-mt/system-config-module-mt/tests/
- 测试类型: 单元测试 + 集成测试
- 覆盖率目标: 单元测试 ≥ 80%,集成测试 ≥ 60%
测试文件结构
tests/integration/system-config-redis-cache.integration.test.ts - Redis缓存集成测试
- 现有测试文件保持不变
测试场景
- 缓存命中测试
- 缓存未命中测试
- 缓存失效测试
- 缓存穿透保护测试
- 多租户缓存隔离测试
现有模块参考模式
- 认证模块:
packages/core-module-mt/auth-module-mt/
- 用户模块:
packages/core-module-mt/user-module-mt/
- 文件模块:
packages/core-module-mt/file-module-mt/
- 命名约定: 所有文件使用
.mt.ts 后缀,遵循多租户包命名规范
Change Log
| Date |
Version |
Description |
Author |
| 2025-11-20 |
1.0 |
初始故事创建 |
Bob (Scrum Master) |
| 2025-11-20 |
1.1 |
为任务列表标注参考文件路径 |
Claude Code |
Dev Agent Record
Agent Model Used
- Agent: Claude Sonnet 4.5 (claude-sonnet-4-5-20250929)
- Environment: Claude Code CLI in VSCode Extension
- Session Date: 2025-11-20
Debug Log References
- 测试失败调试: 初始测试有3个失败,通过
pnpm test -t "缓存命中测试"等命令调试
- TypeORM语法修复: 发现
{ configKey: missingKeys }语法错误,改为{ configKey: In(missingKeys) }
- 批量缓存逻辑: 修复批量查询中的数据库查询和缓存更新逻辑
- 缓存预热验证: 验证异步缓存预热操作的正确性
Completion Notes List
- ✅ Redis工具类扩展: 成功扩展RedisUtil,添加系统配置缓存方法
- ✅ 系统配置服务集成: 成功集成Redis缓存到SystemConfigServiceMt
- ✅ 缓存策略实现: 实现默认1小时TTL、5分钟空值缓存TTL
- ✅ 缓存失效机制: 在setConfig、deleteConfig、update方法中正确清除缓存
- ✅ 缓存穿透保护: 实现空值缓存机制防止缓存穿透攻击
- ✅ 多租户缓存隔离: 按租户ID隔离缓存,确保数据安全
- ✅ 批量缓存操作: 实现高效的批量配置获取和缓存
- ✅ 缓存预热功能: 实现系统启动时预加载常用配置
- ✅ 集成测试覆盖: 创建8个完整的集成测试用例
- ✅ 回归测试验证: 所有现有功能保持完整,无回归
File List
修改的文件
packages/shared-utils/src/utils/redis.util.ts - 扩展Redis工具类
packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts - 集成Redis缓存
docs/prd/epic-010-system-config-multi-tenant.md - 更新史诗文档
docs/stories/010.002.system-config-redis-cache.story.md - 更新故事文档
新增的文件
packages/core-module-mt/system-config-module-mt/tests/integration/system-config-redis-cache.integration.test.ts - Redis缓存集成测试
实施经验总结
- 技术挑战: TypeORM的
In操作符使用需要特别注意,不能直接传递数组
- 缓存策略: 空值缓存TTL设置为5分钟,正常值TTL设置为1小时,平衡了性能和存储
- 批量操作: 批量缓存查询显著提高了性能,减少了Redis连接次数
- 测试覆盖: 集成测试确保了缓存逻辑的正确性和多租户隔离
- 错误处理: Redis连接错误自动处理,不影响主要业务逻辑
QA Results
- 测试结果: 8个Redis缓存集成测试全部通过
- 回归测试: 16个系统配置模块测试全部通过
- 性能验证: 缓存命中率显著提高,数据库访问次数减少
- 功能验证: 所有验收标准满足,无功能回归