From 1d37696815d4011fcd984c94600766bfbf86a541 Mon Sep 17 00:00:00 2001 From: Yun Date: Tue, 29 Aug 2023 10:27:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=A8=E5=B1=80=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cluster.go | 4 +++- lockx/lockx.go | 25 ++++++++++++++++++------- lockx/lockx_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 lockx/lockx_test.go diff --git a/cluster.go b/cluster.go index fc81762..1af028f 100644 --- a/cluster.go +++ b/cluster.go @@ -40,7 +40,7 @@ func InitCluster(ctx context.Context, red *redis.Client) *cluster { zsetKey: "timer:zsetKey", } - timer := time.NewTicker(time.Millisecond*100) + timer := time.NewTicker(time.Millisecond * 100) go func(ctx context.Context, red *redis.Client) { Loop: @@ -219,6 +219,8 @@ func (c *cluster) getTask() { // 执行任务 func doTask(ctx context.Context, red *redis.Client, taskId string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() defer func() { if err := recover(); err != nil { diff --git a/lockx/lockx.go b/lockx/lockx.go index 74214d9..6dc3d84 100644 --- a/lockx/lockx.go +++ b/lockx/lockx.go @@ -3,6 +3,7 @@ package lockx import ( "context" "fmt" + "log" "time" "github.com/go-redis/redis/v8" @@ -32,8 +33,10 @@ func (g *globalLock) Lock() bool { return redis.call('set',KEYS[1],ARGV[1],'EX',ARGV[2]) ` - resp, _ := g.redis.Eval(g.ctx, script, []string{g.uniqueKey}, g.value, 10).Result() - + resp, err := g.redis.Eval(g.ctx, script, []string{g.uniqueKey}, g.value, 10).Result() + if resp != "OK" { + log.Println("globalLock Lock", resp, err) + } return resp == "OK" } @@ -55,19 +58,23 @@ func (g *globalLock) Unlock() bool { local token = redis.call('get',KEYS[1]) if token == ARGV[1] then - return redis.call('del',KEYS[1]) + redis.call('del',KEYS[1]) + return 'OK' end return 'ERROR' ` - resp, _ := g.redis.Eval(g.ctx, script, []string{g.uniqueKey}, g.value).Result() + resp, err := g.redis.Eval(g.ctx, script, []string{g.uniqueKey}, g.value).Result() + if resp != "OK" { + log.Println("globalLock Unlock", resp, err) + } return resp == "OK" } // 刷新锁 func (g *globalLock) Refresh() { go func() { - ctx,cancel := context.WithTimeout(g.ctx, time.Second*30) + ctx, cancel := context.WithTimeout(g.ctx, time.Second*30) defer cancel() t := time.NewTicker(time.Second) @@ -88,11 +95,15 @@ func (g *globalLock) refresh() bool { local token = redis.call('get',KEYS[1]) if token == ARGV[1] then - return redis.call('set',KEYS[1],ARGV[1],'EX',ARGV[2]) + redis.call('set',KEYS[1],ARGV[1],'EX',ARGV[2]) + return 'OK' end return 'ERROR' ` - resp, _ := g.redis.Eval(g.ctx, script, []string{g.uniqueKey}, g.value, 5).Result() + resp, err := g.redis.Eval(g.ctx, script, []string{g.uniqueKey}, g.value, 5).Result() + if resp != "OK" { + log.Println("globalLock refresh", resp, err) + } return resp == "OK" } diff --git a/lockx/lockx_test.go b/lockx/lockx_test.go new file mode 100644 index 0000000..bc3c1f2 --- /dev/null +++ b/lockx/lockx_test.go @@ -0,0 +1,42 @@ +package lockx_test + +import ( + "context" + "fmt" + "testing" + + "code.yun.ink/open/timer/lockx" + "github.com/go-redis/redis/v8" +) + +var Redis *redis.Client + +func TestMain(m *testing.M) { + client := redis.NewClient(&redis.Options{ + Addr: "127.0.0.1" + ":" + "6379", + Password: "", // no password set + DB: 0, // use default DB + }) + if client == nil { + fmt.Println("redis init error") + return + } + Redis = client +} + +func TestLockx(t *testing.T) { + ctx := context.Background() + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + lock := lockx.NewGlobalLock(ctx, Redis, "lockx:test") + + if !lock.Lock() { + t.Log("lock error") + } + defer lock.Unlock() + lock.Refresh() + + t.Log("doing") + +}