Gin 集成 go-redis 模块、操作 redis | Go 主题月

8,289 阅读1分钟

安装

moose-go 基础之上进行开发

go get github.com/go-redis/redis/v8

封装操作 redis

redis_helper.go

  • 使用 redis.NewClient 创建 redis 实例
  • 使用 sync 进行单利模式封装
package engine

import (
	"sync"
	"time"

	"github.com/go-redis/redis/v8"
)

type RedisHelper struct {
	*redis.Client
}

var redisHelper *RedisHelper

var redisOnce sync.Once

func GetRedisHelper() *RedisHelper {
	return redisHelper
}

func NewRedisHelper() *redis.Client {
	rdb := redis.NewClient(&redis.Options{
		Addr:         "localhost:6379",
		Password:     "",
		DB:           0,
		DialTimeout:  10 * time.Second,
		ReadTimeout:  30 * time.Second,
		WriteTimeout: 30 * time.Second,
		PoolSize:     10,
		PoolTimeout:  30 * time.Second,
	})

	redisOnce.Do(func() {
		rdh := new(RedisHelper)
		rdh.Client = rdb
		redisHelper = rdh
	})

	return rdb
}

使用

在启动应用前,初始化redis,建立 redis 连接

var (
	ctx = context.Background()
)

...

rdb := engine.NewRedisHelper()
if _, err := rdb.Ping(ctx).Result(); err != nil {
  log.Fatal(err.Error())
  return
}

使用 gin 编写两个接口

  • 缓存一个用户信息到 redis
  • 把缓存到 redis 中用户通过接口获取到

初始化路由获取 RedisHelper

var ctx = context.Background()

var redisHelper *engine.RedisHelper

func (uc *UserController) RegisterRouter(app *gin.Engine) {
	...
	
	redisHelper = engine.GetRedisHelper()

...
}

缓存用户接口

// 路由添加
group.GET("/cache", uc.CacheUser)

.....
	
	// 缓存用户接口逻辑
func (uc *UserController) CacheUser(c *gin.Context) {
	userInfo := &model.UserInfo{UserId: "56867897283718"}
	name, err := redisHelper.Set(ctx, "moose-go", userInfo, 10*time.Minute).Result()
	if err != nil {
		log.Fatal(err)
		common.Failed(c, "缓存用户失败")
		return
	}
	common.Success(c, name, "缓存用户成功")
}

在保存结构体对象时,需要结构实现 MarshalBinary 方法,要不然会报错

[GIN-debug] Listening and serving HTTP on 0.0.0.0:8090 2021/03/29 22:55:37 redis: can't marshal *model.UserInfo (implement encoding.BinaryMarshaler) exit status 1

使用 json 序列化成二进制

func (u *UserInfo) MarshalBinary() ([]byte, error) {
	return json.Marshal(u)
}

image-20210329231828879

从缓存获取保存的用户

...
	group.GET("/cache/get", uc.GetCacheUser)
...

func (uc *UserController) GetCacheUser(c *gin.Context) {
	name, err := redisHelper.Get(ctx, "moose-go").Result()
	if err != nil {
		log.Fatal(err)
		common.Failed(c, "获取缓存用户失败")
		return
	}

	var userInfo model.UserInfo
	json.Unmarshal([]byte(name), &userInfo)
	common.Success(c, userInfo, "获取缓存用户成功")
}
  • 从 redis 中获取出来的数据,使用 json 反序列化成结构体

image-20210329232251462

其他

  • 在使用 go-redis 过程中,需要对 redis 命令熟悉
  • go-redis 封装了 redis 原生命令,对外暴露 API ,可以直接调用使用

Demo 源码地址:moose-go