Files
zt-closet-backend/.codebuddy/plans/redismodel_key_设计对齐_mysqlmodel_da53c011(未完成).md
T
2026-09-11 01:41:52 +08:00

129 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: redismodel key 设计对齐 mysqlmodel
overview: 以 internal/mysqlmodel 的实体与字段术语为基准,修复 internal/redismodel 的 Redis key 常量命名、文件组织与 key 字符串,使其语义对齐,并做最小引用同步以保持编译通过。
todos:
- id: refactor-key-basics
content: 新建 keys.go 抽取 RedisPrefix,删除 org.go 并拆分为 like.go 与 collect.go
status: pending
- id: align-quota-keys
content: 修改 quota.go 对齐 mysqlmodel 术语,并补充 lock.go 注释
status: pending
dependencies:
- refactor-key-basics
- id: align-auth-user-keys
content: 修改 auth.go 的 token key 为复数 Set 语义,新增 user.go 定义 KeyUserInfo
status: pending
dependencies:
- refactor-key-basics
- id: sync-redisdao-refs
content: 同步 redisdao 中 quota.go 与 user.go 的常量引用
status: pending
dependencies:
- align-quota-keys
- align-auth-user-keys
- id: build-lint-verify
content: 运行 go build 与 read_lints 校验编译与引用完整性
status: pending
dependencies:
- sync-redisdao-refs
---
## 产品概述
以 `internal/mysqlmodel` 的实体与字段术语为唯一基准,重构 `internal/redismodel` 下的 Redis key 常量设计,使 Redis 命名空间与数据库模型语义保持一致。本次仅修改 key 常量定义,并做 `internal/redisdao` 中常量引用的最小同步,不改动任何业务逻辑实现。
## 核心功能
- 将全局前缀 `RedisPrefix` 从 `auth.go` 抽取到独立文件 `keys.go`
- 删除命名不符的 `org.go`,按 mysqlmodel 的 `like.go`/`collect.go` 拆分为两个文件
- 对齐 quota key 术语:`community` 改为 `outfit_share`(社区分享/搭配分享)、`wardrobe_share` 改为 `closet_share`(衣柜分享)、`upload` 改为 `cos`(cos 上传额度)
- 将 `KeyAuthUserToken` 改为复数 Set 语义 `KeyAuthUserTokens`,支持多端登录一对多 token
- 新增 `KeyUserInfo` 常量,把 `redisdao/user.go` 中绕开统一管理的 `user:info:` 前缀纳入 redismodel 并补上 `ztcloset:` 命名空间
- 同步 `redisdao` 中对被重命名常量的引用,保证编译通过
## 技术栈
- 语言:Go
- 改动核心:`internal/redismodel` 下的 Redis key 常量定义
- 语义基准:`internal/mysqlmodel`(`user.go`、`quota.go`、`like.go`、`collect.go`、`order.go`、`goods.go`、`quotaflowlog.go`)
- 最小同步:`internal/redisdao`(仅更新常量引用,不改函数逻辑与函数名)
## 实现方案
### 总体策略
以 mysqlmodel 的实体命名和字段注释为准,重命名 Redis key 常量和 key 字符串,使两层模型术语一致。重命名导致 key 字符串变化,用户已确认适用于未上线/可清库场景。由于 `redisdao` 直接引用了这些常量,必须同步更新引用,否则无法编译。
### 关键决策
1. **`RedisPrefix` 独立成文件**:从 `auth.go` 移至新建的 `keys.go`,作为全包共享的命名空间前缀,消除其他文件对 `auth.go` 的隐式依赖。
2. **`org.go` 拆分为 `like.go` 与 `collect.go`**:对齐 mysqlmodel 的文件划分,每个文件只包含对应业务的 key 常量,并补充 `like_type:target_id`、`collect_type:target_id` 的参数注释。
3. **quota 术语统一**:以 `UserDailyUsage` 字段和 `Quota.QuotaType` 注释为准,AI 保持不变,`community` 统一为 `outfit_share`,`wardrobe_share` 统一为 `closet_share`,`upload` 统一为 `cos`。
4. **token 一对多语义修正**:`KeyAuthUserToken` 改为 `KeyAuthUserTokens`,key 使用复数 `auth:user:tokens:%d`,注释明确为 `user_id -> token 集合(Set)`,支持多端登录。该常量当前无引用,改名不产生编译影响。
5. **`user:info` 纳入统一管理**:新增 `redismodel/user.go` 定义 `KeyUserInfo`(带 `ztcloset:` 前缀),`redisdao/user.go` 移除本地 `userInfoKeyPrefix` 常量并改用该常量。
6. **锁定 key 保留并补注释**:`lock.go` 的三个常量与 mysqlmodel 的 `Order`、AIRecommend 业务对应,保留不动,仅补充参数与用途注释。
7. **不改 redisdao 函数名**:`QuotaDailyIncrCommunity`、`QuotaDailyIncrShare` 等函数名本次不调整,仅同步函数体内引用的常量名,避免扩大影响面。
## 目录结构
```
internal/redismodel/
├── keys.go # [NEW] 定义全局 RedisPrefix = "ztcloset:"
├── auth.go # [MODIFY] 移除 RedisPrefix;KeyAuthUserToken 改为 KeyAuthUserTokens(Set 语义)
├── quota.go # [MODIFY] community→outfit_share、wardrobe_share→closet_share、upload→cos
├── like.go # [NEW] KeyLikeSet(由 org.go 拆分)
├── collect.go # [NEW] KeyCollectSet(由 org.go 拆分)
├── org.go # [DELETE] 内容已拆分至 like.go/collect.go
├── lock.go # [MODIFY] 补充参数与用途注释(常量不变)
└── user.go # [NEW] KeyUserInfo 缓存 key 常量
internal/redisdao/
├── quota.go # [MODIFY] 同步引用 KeyQuotaDailyOutfitShare / KeyQuotaDailyClosetShare
└── user.go # [MODIFY] 移除本地 userInfoKeyPrefix,改用 redismodel.KeyUserInfo
```
## 关键代码结构
修复后的 `internal/redismodel` key 常量全集:
```
// keys.go
const RedisPrefix = "ztcloset:"
// auth.go
const (
KeyAuthAccess = RedisPrefix + "auth:access:%s" // access_token -> user_id
KeyAuthRefresh = RedisPrefix + "auth:refresh:%s" // refresh_token -> user_id
KeyAuthUserTokens = RedisPrefix + "auth:user:tokens:%d" // user_id -> token 集合(Set,支持多端登录)
)
// quota.go
const (
KeyQuotaDailyAI = RedisPrefix + "quota:daily:ai:%d:%s" // user_id:date,当日AI推荐次数
KeyQuotaDailyOutfitShare = RedisPrefix + "quota:daily:outfit_share:%d:%s" // user_id:date,当日社区分享次数(搭配分享)
KeyQuotaDailyClosetShare = RedisPrefix + "quota:daily:closet_share:%d:%s" // user_id:date,当日衣柜分享次数
KeyQuotaCosTotal = RedisPrefix + "quota:cos:total:%d" // user_id,cos 上传总配额
)
// like.go
const KeyLikeSet = RedisPrefix + "like:set:%d:%d" // like_type:target_id
// collect.go
const KeyCollectSet = RedisPrefix + "collect:set:%d:%d" // collect_type:target_id
// lock.go
const (
KeyLockOrderCreate = RedisPrefix + "lock:order:create:%d" // order_id,下单防重
KeyLockPayCallback = RedisPrefix + "lock:pay:callback:%s" // order_no,支付回调幂等
KeyLockAIRecommend = RedisPrefix + "lock:ai:recommend:%d" // user_id,AI推荐防并发
)
// user.go
const KeyUserInfo = RedisPrefix + "user:info:%d" // user_id,缓存用户鉴权核心信息
```
## 实现注意事项
- 修改后需运行 `go build ./...` 与 `read_lints` 校验,重点确认 `redisdao` 内无遗漏的旧常量引用。
- 严格限定在 key 常量层:不改 `redisdao` 的函数名与业务逻辑,不改 `middleware/lzcwyjwt.go` 的 status 判断,不改 quota 过期/时区实现。
- key 字符串变更属于破坏性变更,依赖可清库/未上线前提(用户已确认)。