Redis 集成:g.Redis() 基本命令封装与连接配置
引言
缓存、计数器、分布式锁都常用 Redis。GoFrame 的 gredis 组件对官方 Redis 协议做了封装,通过 g.Redis() 即可使用默认分组连接,支持任意命令与常用命令方法。
概念
- 连接配置:
config.yaml中redis节点按分组配置,默认分组default。 - 门面获取:
g.Redis()获取默认分组,g.Redis("分组名")获取指定分组。 - 命令调用:最通用的方式是
g.Redis().Do(ctx, "命令", 参数...),返回*gvar.Var;框架对常用命令(如 Set/Get 等)也提供方法封装,具体方法清单以官方文档 gredis 章节为准。 - 上下文:gredis 方法与 v2 风格一致,首个参数是
context.Context。
代码示例
先看配置:
redis:
default:
address: "127.0.0.1:6379"
db: 0
pass: "" # 无密码留空
cache:
address: "127.0.0.1:6379"
db: 1
基本读写(通用 Do 方式):
package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
ctx := gctx.New()
// 写入:SET key value [EX seconds]
_, err := g.Redis().Do(ctx, "SET", "user:1", "john")
if err != nil {
panic(err)
}
// 带过期时间:300 秒后自动删除
_, err = g.Redis().Do(ctx, "SET", "sms:code", "123456", "EX", 300)
if err != nil {
panic(err)
}
// 读取:GET key
v, err := g.Redis().Do(ctx, "GET", "user:1")
if err != nil {
panic(err)
}
fmt.Println("user:1 =", v.String())
// 自增计数器:INCR key
v, err = g.Redis().Do(ctx, "INCR", "visit:count")
if err != nil {
panic(err)
}
fmt.Println("visit:count =", v.Int())
// Hash 操作:HSET / HGETALL
_, _ = g.Redis().Do(ctx, "HSET", "user:hash", "name", "john")
_, _ = g.Redis().Do(ctx, "HSET", "user:hash", "age", 20)
all, err := g.Redis().Do(ctx, "HGETALL", "user:hash")
if err != nil {
panic(err)
}
fmt.Println("hash =", all.Map())
// 删除:DEL key
_, _ = g.Redis().Do(ctx, "DEL", "sms:code")
}
注意点
Do返回的*gvar.Var对 Hash 等复杂结构可用.Map()、.Strings()等转换;转错类型会得到空结果而不是报错,注意校验。- Redis 命令名、参数顺序与原生 Redis 一致,写错命令会返回协议错误。
- 分组配置隔离不同业务缓存(如默认库与 cache 库),避免 key 冲突。
- 生产环境务必配置
pass/user与合理超时参数(连接超时等字段见官方配置说明)。
小结
redis.default 配置 + g.Redis().Do(ctx, cmd, args...) 即可完成绝大多数 Redis 操作;常用命令也有框架提供的方法封装。连接池、命令方法全集以官方文档 goframe.org 的 gredis 章节为准。