安装
在 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)
}
从缓存获取保存的用户
...
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 反序列化成结构体
其他
- 在使用 go-redis 过程中,需要对 redis 命令熟悉
- go-redis 封装了 redis 原生命令,对外暴露 API ,可以直接调用使用
Demo 源码地址:moose-go