package lock import ( "context" "eta/eta_api/utils" "fmt" "github.com/go-redis/redis/v8" ) const ( lockName = "lock:" ) var ( ctx = context.Background() ) func AcquireLock(key string, expiration int, Holder string) bool { script := redis.NewScript(`local key = KEYS[1] local clientId = ARGV[1] local expiration = tonumber(ARGV[2]) if redis.call("EXISTS", key) == 0 then redis.call("SET", key, clientId, "EX", expiration) return 1 else return 0 end`) fmt.Println("lockName:"+lockName+key, "Holder:"+Holder, "expiration:"+fmt.Sprintf("%d", expiration)) lockey := fmt.Sprintf("%s%s", lockName, key) result, err := script.Run(ctx, utils.Rc.RedisClient(), []string{lockey}, Holder, expiration).Int() if err != nil { fmt.Printf("加锁失败:err: %v", err) return false } if result == 1 { return true } fmt.Printf("加锁失败:") return false } func ReleaseLock(key string, holder string) bool { script := redis.NewScript(` if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end `) fmt.Println("lockName:"+lockName+key, "Holder:"+holder) lockey := fmt.Sprintf("%s%s", lockName, key) result, err := script.Run(ctx, utils.Rc.RedisClient(), []string{lockey}, holder).Int() if err != nil { fmt.Printf("解锁失败:err: %v", err) return false } if result == 1 { return true } fmt.Printf("解锁失败:") return false }