Redis 集成:g.Redis().Do 与封装命令
结论:Redis 客户端由 g.Redis()(单例、按配置分组)统一管理;Do(ctx, command, args...) 可执行任意 Redis 命令并返回 *gvar.Var;建议把散落的原始命令封装成语义化方法,统一超时、序列化与错误处理(v2 底层驱动细节以官方文档为准)。
一、核心要点
- 单例分组:redis.default 对应 g.Redis(),其他分组用 g.Redis("groupName")。
- Do 通用入口:任何命令都能发,返回值 gvar 可链式转 String/Int/Struct 等。
- 多实例类型(单机/集群/哨兵)通过配置声明(以官方 redis 配置文档为准)。
- 命令封装:团队内常封装 SetUser/GetUser 等方法,内部完成序列化与错误归一,避免业务层直接写裸命令。
配置与代码示例
redis:
default:
address: 127.0.0.1:6379
db: 0
cache: # 第二组实例:g.Redis("cache")
address: 127.0.0.1:6380
db: 1
// 写:SET user:1 {json} EX 3600
_, err := g.Redis().Do(ctx, "SET", "user:1", `{"name":"tom"}`, "EX", 3600)
if err != nil {
g.Log().Error(ctx, err)
}
// 读:返回值 *gvar.Var
v, err := g.Redis().Do(ctx, "GET", "user:1")
if !v.IsNil() {
user := gjson.New(v.String()) // 二次解析 JSON 结构
g.Log().Info(ctx, user.Get("name").String())
}
常见追问 / 记忆点
- 追问:为什么所有方法都要传 ctx?→ 与日志/链路一致,Redis 调用纳入 trace,便于全链路排障。
- 追问:与直接用 go-redis 有何关系?→ 官方 Redis 组件的底层实现/适配以官方文档为准;统一走 g.Redis 可获得单例管理、配置分组与链路一致性。
- 记忆点:Do = 万能命令入口,返回 gvar 随便转;“命令要封装、超时要统一、ctx 要传到底”。