lock.go 679 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package lock
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/zeromicro/go-zero/core/stores/redis"
  6. "time"
  7. )
  8. func NewRedisLock(key string, r *redis.Redis) *RedisLock {
  9. lock := redis.NewRedisLock(r, fmt.Sprintf("LOCK_%v", key))
  10. lock.SetExpire(5)
  11. return &RedisLock{lock}
  12. }
  13. type RedisLock struct {
  14. *redis.RedisLock
  15. }
  16. func (rl *RedisLock) Lock() error {
  17. for {
  18. acquire, err := rl.Acquire()
  19. switch {
  20. case err != nil:
  21. return err
  22. case acquire:
  23. // 获取到锁
  24. return nil
  25. case !acquire:
  26. time.Sleep(200 * time.Millisecond)
  27. }
  28. }
  29. }
  30. func (rl *RedisLock) UnLock() error {
  31. release, err := rl.Release()
  32. if !release {
  33. err = errors.New("解锁失败")
  34. }
  35. return err
  36. }