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

7.0 KiB
Raw Permalink Blame History

name, overview, todos
name overview todos
redismodel key 设计对齐 mysqlmodel 以 internal/mysqlmodel 的实体与字段术语为基准,修复 internal/redismodel 的 Redis key 常量命名、文件组织与 key 字符串,使其语义对齐,并做最小引用同步以保持编译通过。
id content status
refactor-key-basics 新建 keys.go 抽取 RedisPrefix,删除 org.go 并拆分为 like.go 与 collect.go pending
id content status dependencies
align-quota-keys 修改 quota.go 对齐 mysqlmodel 术语,并补充 lock.go 注释 pending
refactor-key-basics
id content status dependencies
align-auth-user-keys 修改 auth.go 的 token key 为复数 Set 语义,新增 user.go 定义 KeyUserInfo pending
refactor-key-basics
id content status dependencies
sync-redisdao-refs 同步 redisdao 中 quota.go 与 user.go 的常量引用 pending
align-quota-keys
align-auth-user-keys
id content status dependencies
build-lint-verify 运行 go build 与 read_lints 校验编译与引用完整性 pending
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 字符串变更属于破坏性变更,依赖可清库/未上线前提(用户已确认)。