diff --git a/go.mod b/go.mod index de94bc4..1e002f6 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,10 @@ module github.com/yuninks/lockx go 1.20 -require github.com/go-redis/redis/v8 v8.11.5 +require ( + github.com/go-redis/redis/v8 v8.11.5 + github.com/google/uuid v1.6.0 +) require ( github.com/cespare/xxhash/v2 v2.1.2 // indirect diff --git a/go.sum b/go.sum index 7342ff8..735ea23 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cu github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= diff --git a/lockx.go b/lockx.go index 4895024..7699355 100644 --- a/lockx.go +++ b/lockx.go @@ -2,10 +2,10 @@ package lockx import ( "context" - "fmt" "time" "github.com/go-redis/redis/v8" + "github.com/google/uuid" ) // 全局锁 @@ -17,16 +17,17 @@ type globalLock struct { value string } - - func NewGlobalLock(ctx context.Context, red redis.UniversalClient, uniqueKey string) *globalLock { ctx, cancel := context.WithTimeout(ctx, opt.lockTimeout) + + u, _ := uuid.NewV7() + return &globalLock{ redis: red, ctx: ctx, cancel: cancel, uniqueKey: uniqueKey, - value: fmt.Sprintf("%d", time.Now().UnixNano()), + value: u.String(), } } diff --git a/lockx_test.go b/lockx_test.go index fde321d..a223205 100644 --- a/lockx_test.go +++ b/lockx_test.go @@ -3,10 +3,11 @@ package lockx_test import ( "context" "fmt" + "sync" "testing" - "github.com/yuninks/lockx" "github.com/go-redis/redis/v8" + "github.com/yuninks/lockx" ) var Redis *redis.Client @@ -28,8 +29,8 @@ var Redis *redis.Client func TestLockx(t *testing.T) { client := redis.NewClient(&redis.Options{ Addr: "127.0.0.1" + ":" + "6379", - Password: "", // no password set - DB: 0, // use default DB + Password: "123456", // no password set + DB: 0, // use default DB }) if client == nil { fmt.Println("redis init error") @@ -40,13 +41,21 @@ func TestLockx(t *testing.T) { ctx, cancel := context.WithCancel(ctx) defer cancel() - lock := lockx.NewGlobalLock(ctx, client, "lockx:test") + wg := sync.WaitGroup{} - if !lock.Lock() { - fmt.Println("lock error") + for i := 0; i < 10000; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + lock := lockx.NewGlobalLock(ctx, client, "lockx:test") + defer lock.Unlock() + if !lock.Lock() { + fmt.Println("lock error", i) + return + } + fmt.Println("ssss", i) + }(i) } - defer lock.Unlock() - - fmt.Println("ssss") + wg.Wait() }