回顾redis分布式锁
获取锁成功后为了防止客户端进程失败无法正常释放锁进而导致其他的客户端再也获得不到锁,在使用SETNX的时候我们还需要为每个锁加一个过期时间Expire Time, 这样即使在客户端不能正常释放锁的情况下,过期时间到了之后,Redis会自动释放掉锁来让别的客户端能够继续申请锁。这就是一种典型的租约机制,客户端申请了一个租约时长为lock_timeout的锁,客户端可以在租约期间使用完之后正常释放锁,如果过了租约时间,即使客户端没有释放锁,Redis也会自动释放掉这个锁。
问题:
这个租约日期设置的时间长短是个问题
如果设置的过短,那么就可能客户端还没用完锁,锁就被Redis给释放了,造成后续多个客户端同时访问某资源的错误,如果设置的时间过长,那么当客户端因为failure不能正常释放锁的时候,其他客户端就需要等待较长的时间(时间过了锁的租约期)才能够重新释放锁。
解决方法
方法1:定时自动去续约(expire key second)
具体操作:
搞一个watchdog:当我们并不知道自己将会用多久的锁时,我们为该锁设置一个较小的lock_timeout,同时每隔一段时间在该锁过期之前,就自动的向服务器延长该锁的lifetime。
参考[https://zhuanlan.zhihu.com/p/101913195]
方法2:记录业务处理时长,设置过期时间:业务时长+一定时间
具体操作
每次获取锁后,记录业务代码执行的时长,在redis中存一个上次时长,再次获取锁时 设置过期时间为上次时长+N秒
参考:https://github.com/SPSCommerce/redlock-py/issues/30
标签:释放,过期,redis,时间,租约,失效,分布式,客户端 From: https://www.cnblogs.com/aleiyoy/p/16601888.html