--- 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 字符串变更属于破坏性变更,依赖可清库/未上线前提(用户已确认)。