如何为RedLockFactory.CreateLockAsync()方法选择正确的expiryTime参数值?<



我正在使用RedLock.net库进行资源锁定。要锁定资源,我使用RedLockFactory.CreateLockAsync.

public async Task<IRedLock> RedLockFactory.CreateLockAsync(string resource,
TimeSpan expiryTime,
TimeSpan waitTime,
TimeSpan retryTime,
CancellationToken? cancellationToken = null)

我理解这个方法将尝试通过不断重试每个retryTime来获取waitTime的锁。然而,我不明白expiryTime的正确值是什么。一旦获得了一个锁,它将一直保持到该锁是Disposed为止,这与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服务器上放置的负载之间的平衡。

最新更新