如何为 RedLockFactory.CreateLockAsync() 方法的 expiryTime 参数选择正确的值?
How to choose the right value for the expiryTime parameter for RedLockFactory.CreateLockAsync() method?
我正在使用 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 分钟,直到密钥在 Redis 中过期并且另一个进程可以取出对同一资源的锁
如果您将到期时间设置为 10 毫秒:
- 自动锁更新定时器会每隔5毫秒(过期时间/2)调用redis来延长锁(可能有点过分)
- 如果您的进程在没有释放锁的情况下崩溃,您将不得不等待最多 10 毫秒,直到密钥在 Redis 中过期并且另一个进程可以取出对同一资源的锁
这是在发生故障时您愿意等待锁过期的时间与您对 redis 服务器施加的负载之间的平衡。
我正在使用 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 分钟,直到密钥在 Redis 中过期并且另一个进程可以取出对同一资源的锁
如果您将到期时间设置为 10 毫秒:
- 自动锁更新定时器会每隔5毫秒(过期时间/2)调用redis来延长锁(可能有点过分)
- 如果您的进程在没有释放锁的情况下崩溃,您将不得不等待最多 10 毫秒,直到密钥在 Redis 中过期并且另一个进程可以取出对同一资源的锁
这是在发生故障时您愿意等待锁过期的时间与您对 redis 服务器施加的负载之间的平衡。