Redis 集成:g.Redis() 基本命令封装与连接配置

引言

缓存、计数器、分布式锁都常用 Redis。GoFrame 的 gredis 组件对官方 Redis 协议做了封装,通过 g.Redis() 即可使用默认分组连接,支持任意命令与常用命令方法。

概念

  • 连接配置:config.yamlredis 节点按分组配置,默认分组 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 章节为准。

笔记加载中…