Files
platform/web/globals/redis.go

58 lines
1.1 KiB
Go

package globals
import (
"log/slog"
"net"
"platform/pkg/env"
"platform/web/core"
"github.com/go-redsync/redsync/v4/redis/goredis/v9"
"github.com/go-redsync/redsync/v4"
"github.com/redis/go-redis/v9"
)
var Redis *redis.Client
var Redsync *ExtendRedSync
type ExtendRedSync struct {
*redsync.Redsync
}
func initRedis() error {
client := redis.NewClient(&redis.Options{
Addr: net.JoinHostPort(env.RedisHost, env.RedisPort),
Password: env.RedisPassword,
})
pool := goredis.NewPool(client)
sync := redsync.New(pool)
Redis = client
Redsync = &ExtendRedSync{sync}
return nil
}
func closeRedis() error {
if Redis != nil {
return Redis.Close()
}
return nil
}
func (r *ExtendRedSync) WithLock(key string, callback func() error) error {
var mutex = Redsync.NewMutex(key)
var err = mutex.Lock()
if err != nil {
return core.NewServErr("服务繁忙,请稍后重试")
}
defer func(mutex *redsync.Mutex) {
if ok, err := mutex.Unlock(); err != nil {
slog.Error("解锁失败", slog.Bool("ok", ok), slog.Any("err", err))
}
}(mutex)
return callback()
}