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

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)), Work: client.CreateRpcWorker(createRpcPoll(*host)),
} }
e.Run(5000) e.Run(10)
} }
func createRpcPoll(port string) chan *rpc.Client { func createRpcPoll(port string) chan *rpc.Client {

View File

@ -18,11 +18,12 @@ type RedisLock struct {
client *redis.Client client *redis.Client
ctx context.Context ctx context.Context
lockKeepAliveCh chan struct{} lockKeepAliveCh chan struct{}
lockKeepDoneCh chan struct{}
kvt redisCommInfo kvt redisCommInfo
} }
func CreateRedisLock(c *redis.Client, ctx context.Context, k, v string, ttl int) *RedisLock { 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() { 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 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]) elseif redis.call('hincrby',KEYS[1],ARGV[1],-1) == 0 then return redis.call('del',KEYS[1])
else return 0 end` 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) 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() { func (r *RedisLock) autoReNewExpire() {
@ -81,9 +86,15 @@ func (r *RedisLock) autoReNewExpire() {
case <-tc.C: case <-tc.C:
script := `if redis.call('hexists',KEYS[1],ARGV[1]) == 1 then return redis.call('expire',KEYS[1],ARGV[2]) script := `if redis.call('hexists',KEYS[1],ARGV[1]) == 1 then return redis.call('expire',KEYS[1],ARGV[2])
else return 0 end` 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 return
} }
} }
}
} }

View File

@ -8,6 +8,7 @@ import (
"goRedisDLM/redisLock" "goRedisDLM/redisLock"
"log" "log"
"strconv" "strconv"
"time"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"
"github.com/google/uuid" "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) 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() lock.Lock()
time.Sleep(time.Second * 5)
log.Printf("uuid: %s get dlock\n", value.String()) log.Printf("uuid: %s get dlock\n", value.String())
get := i.Client.Get(context.Background(), "inventory") get := i.Client.Get(context.Background(), "inventory")
log.Printf("%s\n", get) log.Printf("%s\n", get)