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)