8
如题:https://go-zero.dev/cn/redis-lock.html 这是文档中的关于redis lock的文档,其中
假如是5毫秒,业务执行需要4毫秒,这时候是没问题的,假如业务有时候需要10毫秒,这时候key已经失效了,我看源码里面没有起对应的g去做key的续期, 我自己本地改动了下源码,但是改动比较大,
type RedisLock struct {
store *Redis
seconds uint32
key string
id string
ddl chan bool
}
func (rl *RedisLock) Acquire() (bool, error) {
rl.ddl = make(chan bool, 1)
rl.ddl <- false
.....
}
func (rl *RedisLock) AcquireLockWithTimeout() error {
ticker := time.NewTicker(time.Duration(int(rl.seconds)))
ddl := <-rl.ddl
go func() {
if !ddl {
for range ticker.C {
ttl, _ := rl.store.Ttl(rl.key)
if ttl == -2 {
_, _ = rl.Acquire()
}
}
}
}()
ticker.Stop()
return nil
}
func (rl *RedisLock) Release() (bool, error) {
rl.ddl <- true
resp, err := rl.store.Eval(delCommand, []string{rl.key}, []string{rl.id})
if err != nil {
return false, err
}
....
}
不知道有木有其他更好的处理办法