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() }