distrubtLock.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package lock
  2. import (
  3. "context"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "github.com/go-redis/redis/v8"
  7. )
  8. const (
  9. lockName = "lock:"
  10. )
  11. var (
  12. ctx = context.Background()
  13. )
  14. func AcquireLock(key string, expiration int, Holder string) bool {
  15. script := redis.NewScript(`local key = KEYS[1]
  16. local clientId = ARGV[1]
  17. local expiration = tonumber(ARGV[2])
  18. if redis.call("EXISTS", key) == 0 then
  19. redis.call("SET", key, clientId, "EX", expiration)
  20. return 1
  21. else
  22. return 0
  23. end`)
  24. lockey := fmt.Sprintf("%s%s", lockName, key)
  25. result, err := script.Run(ctx, utils.Rc.RedisClient(), []string{lockey}, Holder, expiration).Int()
  26. if err != nil {
  27. fmt.Printf("加锁失败:err: %v", err)
  28. return false
  29. }
  30. if result == 1 {
  31. return true
  32. }
  33. return false
  34. }
  35. func ReleaseLock(key string, holder string) bool {
  36. script := redis.NewScript(`
  37. if redis.call("get", KEYS[1]) == ARGV[1] then
  38. return redis.call("del", KEYS[1])
  39. else
  40. return 0
  41. end
  42. `)
  43. lockey := fmt.Sprintf("%s%s", lockName, key)
  44. result, err := script.Run(ctx, utils.Rc.RedisClient(), []string{lockey}, holder).Int()
  45. if err != nil {
  46. fmt.Printf("解锁失败:err: %v", err)
  47. return false
  48. }
  49. if result == 1 {
  50. return true
  51. }
  52. return false
  53. }