lock.go 903 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package p
  2. import (
  3. "app.yhyue.com/moapp/jybase/redis"
  4. "sync/atomic"
  5. "time"
  6. "app.yhyue.com/moapp/jybase/logger"
  7. )
  8. type Lock struct {
  9. Key string
  10. Push string
  11. Match string
  12. E_C int64
  13. E_I bool
  14. }
  15. //
  16. func (l *Lock) Lock(key string) {
  17. atomic.AddInt64(&l.E_C, 1)
  18. for {
  19. if l.E_I {
  20. break
  21. }
  22. v, err := redis.IncrByErr(l.Key, key)
  23. if err == nil {
  24. if v == 1 {
  25. if key == l.Match {
  26. redis.PutCKV(l.Key, l.Push, 1)
  27. } else if key == l.Push {
  28. redis.PutCKV(l.Key, l.Match, 1)
  29. }
  30. break
  31. }
  32. } else {
  33. logger.Error("lock redis inc error", err)
  34. }
  35. logger.Info("目前处于锁住状态,等待", key, "执行完成")
  36. time.Sleep(1 * time.Minute)
  37. }
  38. l.E_I = true
  39. }
  40. //
  41. func (l *Lock) UnLock() {
  42. if atomic.AddInt64(&l.E_C, -1) <= 0 {
  43. l.E_I = false
  44. l.Clear(l.Push, l.Match)
  45. }
  46. }
  47. //
  48. func (l *Lock) Clear(keys ...interface{}) {
  49. redis.Del(l.Key, keys...)
  50. }