完善自动续期,增加完成通知
This commit is contained in:
parent
07acc3f7af
commit
3b2da94e92
2
main.go
2
main.go
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user