From 3b2da94e92ce53e7c099525b284183000b2232b9 Mon Sep 17 00:00:00 2001 From: redhat <2292650292@qq.com> Date: Tue, 11 Feb 2025 19:10:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=87=AA=E5=8A=A8=E7=BB=AD?= =?UTF-8?q?=E6=9C=9F=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AE=8C=E6=88=90=E9=80=9A?= =?UTF-8?q?=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 2 +- redisLock/redis.go | 19 +++++++++++++++---- worker/rpc.go | 5 ++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index b1722bb..25f926f 100644 --- a/main.go +++ b/main.go @@ -27,7 +27,7 @@ func main() { Work: client.CreateRpcWorker(createRpcPoll(*host)), } - e.Run(5000) + e.Run(10) } func createRpcPoll(port string) chan *rpc.Client { diff --git a/redisLock/redis.go b/redisLock/redis.go index 8e0794a..cf87254 100644 --- a/redisLock/redis.go +++ b/redisLock/redis.go @@ -18,11 +18,12 @@ type RedisLock struct { client *redis.Client ctx context.Context lockKeepAliveCh chan struct{} + lockKeepDoneCh chan struct{} kvt redisCommInfo } func CreateRedisLock(c *redis.Client, ctx context.Context, k, v string, ttl int) *RedisLock { - return &RedisLock{c, ctx, make(chan struct{}, 1), redisCommInfo{k, v, ttl}} + return &RedisLock{c, ctx, make(chan struct{}, 1), make(chan struct{}), redisCommInfo{k, v, ttl}} } func (r *RedisLock) Lock() { @@ -63,9 +64,13 @@ func (r *RedisLock) Unlock() { script := `if redis.call('hexists',KEYS[1],ARGV[1]) == 0 then return nil elseif redis.call('hincrby',KEYS[1],ARGV[1],-1) == 0 then return redis.call('del',KEYS[1]) else return 0 end` - r.client.Eval(r.ctx, script, []string{r.kvt.key}, r.kvt.value) - log.Printf("unlock ok: %s,%s,%d\n", r.kvt.key, r.kvt.value, r.kvt.ttl) + if r.client.Eval(r.ctx, script, []string{r.kvt.key}, r.kvt.value).Val().(int64) == 1 { + r.lockKeepDoneCh <- struct{}{} + log.Printf("unlock ok: %s,%s,%d\n", r.kvt.key, r.kvt.value, r.kvt.ttl) + } else { + log.Printf("unlock err: %s,%s,%d\n", r.kvt.key, r.kvt.value, r.kvt.ttl) + } } func (r *RedisLock) autoReNewExpire() { @@ -81,9 +86,15 @@ func (r *RedisLock) autoReNewExpire() { case <-tc.C: script := `if redis.call('hexists',KEYS[1],ARGV[1]) == 1 then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end` - if r.client.Eval(r.ctx, script, []string{r.kvt.key}, r.kvt.value).Val().(int64) == 0 { + + i, ok := r.client.Eval(r.ctx, script, []string{r.kvt.key}, r.kvt.value, r.kvt.ttl).Val().(int64) + if !ok || i == 0 { + log.Printf("auto renew err: %s,%s,%d\n", r.kvt.key, r.kvt.value, r.kvt.ttl) return } + case <-r.lockKeepDoneCh: + log.Printf("auto renew down: %s,%s,%d\n", r.kvt.key, r.kvt.value, r.kvt.ttl) + return } } } diff --git a/worker/rpc.go b/worker/rpc.go index 9ada7a0..82325ca 100644 --- a/worker/rpc.go +++ b/worker/rpc.go @@ -8,6 +8,7 @@ import ( "goRedisDLM/redisLock" "log" "strconv" + "time" "github.com/go-redis/redis/v8" "github.com/google/uuid" @@ -22,9 +23,11 @@ func (i *Inventory) Work(request engine.Request, response *engine.Response) erro log.Printf("uuid: %s, lock key: %s\n", value.String(), request.Dlock) - lock := redisLock.CreateRedisLock(i.Client, context.Background(), request.Dlock, value.String(), 30) + lock := redisLock.CreateRedisLock(i.Client, context.Background(), request.Dlock, value.String(), 3) lock.Lock() + time.Sleep(time.Second * 5) + log.Printf("uuid: %s get dlock\n", value.String()) get := i.Client.Get(context.Background(), "inventory") log.Printf("%s\n", get)