7.0 KiB
7.0 KiB
name, overview, todos
| name | overview | todos | ||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| redismodel key 设计对齐 mysqlmodel | 以 internal/mysqlmodel 的实体与字段术语为基准,修复 internal/redismodel 的 Redis key 常量命名、文件组织与 key 字符串,使其语义对齐,并做最小引用同步以保持编译通过。 |
|
产品概述
以 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 直接引用了这些常量,必须同步更新引用,否则无法编译。
关键决策
RedisPrefix独立成文件:从auth.go移至新建的keys.go,作为全包共享的命名空间前缀,消除其他文件对auth.go的隐式依赖。org.go拆分为like.go与collect.go:对齐 mysqlmodel 的文件划分,每个文件只包含对应业务的 key 常量,并补充like_type:target_id、collect_type:target_id的参数注释。- quota 术语统一:以
UserDailyUsage字段和Quota.QuotaType注释为准,AI 保持不变,community统一为outfit_share,wardrobe_share统一为closet_share,upload统一为cos。 - token 一对多语义修正:
KeyAuthUserToken改为KeyAuthUserTokens,key 使用复数auth:user:tokens:%d,注释明确为user_id -> token 集合(Set),支持多端登录。该常量当前无引用,改名不产生编译影响。 user:info纳入统一管理:新增redismodel/user.go定义KeyUserInfo(带ztcloset:前缀),redisdao/user.go移除本地userInfoKeyPrefix常量并改用该常量。- 锁定 key 保留并补注释:
lock.go的三个常量与 mysqlmodel 的Order、AIRecommend 业务对应,保留不动,仅补充参数与用途注释。 - 不改 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 字符串变更属于破坏性变更,依赖可清库/未上线前提(用户已确认)。