1.6 KiB
1.6 KiB
Redis 租户 Key 约定
通用异步任务的完整接入说明和实现位于 pjcloud-common/pjcloud-common-async-task。本文件记录整个后端工程都应遵循的 Redis 租户 Key 规则。
核心规则
项目 Redis 基础设施会根据当前租户上下文自动为 Redis Key 增加租户前缀。业务代码只负责定义业务命名空间和业务唯一标识,不得再次手工拼接 tenantId。
正确的业务 Key:
async:task:progress:user:import:teacher:{userId}:{taskId}
错误的业务 Key:
async:task:progress:user:import:teacher:{tenantId}:{userId}:{taskId}
错误示例会导致租户维度重复出现在最终 Redis Key 中,增加排查难度,并可能造成同一业务在不同调用方式下无法读取彼此写入的数据。
异步线程要求
“业务 Key 不拼接租户 ID”不代表异步线程不需要租户上下文。异步任务、定时任务等脱离 Web 请求线程执行的逻辑,在访问 Redis、数据库或其他租户资源前,仍必须按项目现有方式恢复 TenantContextHolder,并在任务结束后清理上下文。
租户上下文的职责是让基础设施自动完成租户隔离;业务 Key 的职责是描述具体业务。两者不得混用。
开发检查
- 新增 Redis Key 时只包含业务命名空间及必要的业务唯一标识。
- 禁止使用
TenantContextHolder.getTenantId()、请求头中的租户 ID 或用户对象中的租户 ID 手工拼接 Redis Key。 - 异步执行时确认租户上下文已恢复,并在
finally中清理。 - Redis Key 变更前检查现有读写双方,避免造成历史缓存无法读取。