我正在使用RedLock.net库进行资源锁定。要锁定资源,我使用RedLockFactory.CreateLockAsync.
public async Task<IRedLock> RedLockFactory.CreateLockAsync(string resource,
TimeSpan expiryTime,
TimeSpan waitTime,
TimeSpan retryTime,
CancellationToken? cancellationToken = null)
我理解这个方法将尝试通过不断重试每个retryTime
来获取waitTime
的锁。然而,我不明白expiryTime
的正确值是什么。一旦获得了一个锁,它将一直保持到该锁是Dispose
d为止,这与expiryTime
无关。换句话说,即使expirtyTime
设置为5秒,如果锁只在10秒后被解除,那么锁将保持10秒。
在许多例子中,值30的使用没有任何解释。
我已经测试了一个值为0。根本不需要获取锁。
我用5毫秒的值进行了测试。锁被获取并保留,直到被释放。
那么如何为expiryTime
参数选择正确的值呢?在我看来,这个参数是不必要的,任何非零的正值都是可以的。
ExpiryTime
决定在发生故障(例如,持有锁的进程崩溃)的情况下,锁将被持有的最长时间。它还间接地决定了锁被持有时更新的频率。
。
如果您设置的过期时间为10分钟:
- 自动锁更新定时器将每5分钟(过期时间/2)调用一次redis以延长锁
- 如果你的进程在没有释放锁的情况下崩溃,你将不得不等待最多10分钟,直到key在redis中过期,另一个进程可以在相同的资源上取出锁
如果您设置的过期时间为10毫秒:
- 自动锁更新计时器将每5毫秒(过期时间/2)调用一次redis来延长锁(可能有点超时)
- 如果你的进程在没有释放锁的情况下崩溃,你将不得不等待最多10毫秒,直到key在redis中过期,另一个进程可以在相同的资源上取出锁
这是一个在失败情况下你愿意等待锁过期的时间与你在redis服务器上放置的负载之间的平衡。