package xredis // //import ( // "context" // "encoding/json" // "fmt" // "github.com/go-redis/redis/v8" // "github.com/pkg/errors" // "time" //) // //var redisClient *redis.Client // //func Init(host, password string, db int) error { // redisClient = redis.NewClient(&redis.Options{ // Network: "tcp", // Addr: host, // Password: password, // DB: db, // }) // return redisClient.Ping(context.Background()).Err() //} // //func Client() *redis.Client { // return redisClient //} // //func GetData[T any](ctx context.Context, key string, fn func() (T, error), dur time.Duration) (T, error) { // var result T // res := redisClient.Get(ctx, key).Val() // if res != "" { // err := json.Unmarshal([]byte(res), &result) // if err == nil { // return result, nil // } // } // r, err := fn() // if err != nil { // return result, err // } // if b, err := json.Marshal(r); err == nil { // redisClient.Set(ctx, key, string(b), dur) // } // return r, nil //} //func Lock[T any](ctx context.Context, key string, fn func() (T, error)) (T, error) { // var res T // lockKey := fmt.Sprintf("lock:%s", key) // ok, err := redisClient.SetNX(ctx, lockKey, 1, time.Second*20).Result() // if err != nil { // return res, errors.Wrap(err, "") // } // if !ok { // return res, errors.Wrap(errors.New(fmt.Sprintf("lock %s exists", lockKey)), "") // } // defer redisClient.Del(ctx, lockKey) // return fn() //}