Gin интегрирует модуль go-redis и управляет redis | Go Topic Month

Go

Установить

существуетmoose-goразвиваться на основе

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

Пакетная операция redis

redis_helper.go

  • Создайте экземпляр Redis с помощью redis.NewClient.
  • Инкапсуляция одноэлементного шаблона с помощью rsync
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 и может использоваться напрямую

Адрес исходного кода демо:moose-go