Redission遇到其他进程已经占用资源的时候会在指定时间waitTime内进行重试。实现过程如下:
执行获取锁的lua脚本时,会返回一个值,
如果获取锁成功,返回nil,也就是java里的null
如果获取锁失败,用语句“PTTL KEYS[1]”返回当前锁的剩余有效时间
最终返回到tryLock()函数里,成为局部变量ttl的值,
time是剩余等待时间的值,单位ms
ttl是当前锁的剩余有效时间,单位ms
用了redis里的pubsub机制:
同时在unlock()函数时候会执行一个redis指令:publish,广播该锁已经释放
然后在tryLock()函数里会subscribe这个redis的广播,(订阅该广播,也就是订阅别人释放锁的信号)
接下来会在time的剩余时间内,等待别人释放锁的信号。当收到别人释放锁的信号,并且还在time时间内,就会再次尝试获取锁
WatchDog机制
如果未设置超时释放时间,那么会设置一个30s的默认过期时间,也就是Watchdog,然后开启一个任务(下图大红框)
每当时间到达设定等待时间的1/3时候,就会执行redis指令刷新锁的HSET的过期时间,这样就能给锁无限续期了