增加自动续期
This commit is contained in:
parent
868d533c8f
commit
8310676a47
2
main.go
2
main.go
@ -23,7 +23,7 @@ func main() {
|
|||||||
|
|
||||||
e := engine.FirstEngine{
|
e := engine.FirstEngine{
|
||||||
Scheduler: &scheduler.FirstScheduler{},
|
Scheduler: &scheduler.FirstScheduler{},
|
||||||
WorkCount: 10,
|
WorkCount: 15,
|
||||||
Work: client.CreateRpcWorker(createRpcPoll(*host)),
|
Work: client.CreateRpcWorker(createRpcPoll(*host)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,11 +17,12 @@ type redisCommInfo struct {
|
|||||||
type RedisLock struct {
|
type RedisLock struct {
|
||||||
client *redis.Client
|
client *redis.Client
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
|
lockKeepAliveCh 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, redisCommInfo{k, v, ttl}}
|
return &RedisLock{c, ctx, make(chan struct{}, 1), redisCommInfo{k, v, ttl}}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RedisLock) Lock() {
|
func (r *RedisLock) Lock() {
|
||||||
@ -41,6 +42,13 @@ func (r *RedisLock) Lock() {
|
|||||||
time.Sleep(time.Millisecond * 20)
|
time.Sleep(time.Millisecond * 20)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case r.lockKeepAliveCh <- struct{}{}:
|
||||||
|
go r.autoReNewExpire()
|
||||||
|
default:
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
log.Printf("lock ok: %s,%s,%d\n", r.kvt.key, r.kvt.value, r.kvt.ttl)
|
log.Printf("lock ok: %s,%s,%d\n", r.kvt.key, r.kvt.value, r.kvt.ttl)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,3 +67,23 @@ func (r *RedisLock) Unlock() {
|
|||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *RedisLock) autoReNewExpire() {
|
||||||
|
defer func() {
|
||||||
|
<-r.lockKeepAliveCh
|
||||||
|
}()
|
||||||
|
|
||||||
|
tc := time.NewTicker(time.Duration(r.kvt.ttl) * time.Second / 3)
|
||||||
|
defer tc.Stop()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
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 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user