35 lines
1.6 KiB
Markdown
35 lines
1.6 KiB
Markdown
# Redis 租户 Key 约定
|
||
|
||
通用异步任务的完整接入说明和实现位于 `pjcloud-common/pjcloud-common-async-task`。本文件记录整个后端工程都应遵循的 Redis 租户 Key 规则。
|
||
|
||
## 核心规则
|
||
|
||
项目 Redis 基础设施会根据当前租户上下文自动为 Redis Key 增加租户前缀。业务代码只负责定义业务命名空间和业务唯一标识,**不得再次手工拼接 `tenantId`**。
|
||
|
||
正确的业务 Key:
|
||
|
||
```text
|
||
async:task:progress:user:import:teacher:{userId}:{taskId}
|
||
```
|
||
|
||
错误的业务 Key:
|
||
|
||
```text
|
||
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 变更前检查现有读写双方,避免造成历史缓存无法读取。
|