完善自动续期,增加完成通知

This commit is contained in:
redhat 2025-02-11 19:10:47 +08:00
parent 07acc3f7af
commit 3b2da94e92
3 changed files with 20 additions and 6 deletions

View File

@ -27,7 +27,7 @@ func main() {
Work: client.CreateRpcWorker(createRpcPoll(*host)),
}
e.Run(5000)
e.Run(10)
}
func createRpcPoll(port string) chan *rpc.Client {

View File

@ -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)
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
}
}
}
}

View File

@ -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)