package lock import ( "errors" "fmt" "github.com/zeromicro/go-zero/core/stores/redis" "time" ) func NewRedisLock(key string, r *redis.Redis) *RedisLock { lock := redis.NewRedisLock(r, fmt.Sprintf("LOCK_%v", key)) lock.SetExpire(5) return &RedisLock{lock} } type RedisLock struct { *redis.RedisLock } func (rl *RedisLock) Lock() error { for { acquire, err := rl.Acquire() switch { case err != nil: return err case acquire: // 获取到锁 return nil case !acquire: time.Sleep(200 * time.Millisecond) } } } func (rl *RedisLock) UnLock() error { release, err := rl.Release() if !release { err = errors.New("解锁失败") } return err }