first commit
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
---
|
||||
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 字符串变更属于破坏性变更,依赖可清库/未上线前提(用户已确认)。
|
||||
Reference in New Issue
Block a user