首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为expiryTime ()方法的RedLockFactory.CreateLockAsync参数选择正确的值?

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

Stack Overflow用户
提问于 2021-08-20 00:51:51
回答 1查看 599关注 0票数 0

我使用RedLock.net库来锁定资源。为了锁定一个度假村,我正在使用RedLockFactory.CreateLockAsync。

代码语言:javascript
复制
public async Task<IRedLock> RedLockFactory.CreateLockAsync(string resource,
      TimeSpan expiryTime,
      TimeSpan waitTime,
      TimeSpan retryTime,
      CancellationToken? cancellationToken = null)

据我所知,此方法将试图通过不断地重新尝试每个waitTime来获取retryTime的锁。但是,我不明白expiryTime的正确值是什么。一旦获得了锁,它将一直保存到锁为Disposed,而这与expiryTime无关。换句话说,即使expirtyTime被设置为5秒,如果锁在10秒后才被释放,那么锁将保持10秒。

在许多例子中,使用30的值是没有解释的。

我测试的值为0。锁根本得不到。

我用5毫秒的值进行了测试。获得一个锁,并将其保存到处置为止。

那么如何为expiryTime参数选择正确的值呢?在我看来,这个参数是不必要的,任何非零的正值都可以。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-20 22:34:45

ExpiryTime确定在发生故障时保持锁的最大时间(例如,保持锁崩溃的进程)。它还间接地决定了锁在持有时被更新的频率。

例如:

如果您将到期时间设置为10分钟:

  • 自动锁更新计时器将每5分钟(过期时间/ 2)呼叫redis,以扩展锁
  • ,如果您的进程崩溃而没有释放锁,您将不得不等待最多10分钟,直到密钥在redis中过期,而另一个进程可以取出同一资源

上的锁。

如果将终止时间设置为10毫秒:

  • 自动锁更新计时器将每5毫秒(过期时间/ 2)向redis发出呼叫,以扩展锁(这可能有点过大),如果进程崩溃而不释放锁,则必须等待最多10毫秒,直到密钥在redis中过期,而另一个进程可以取出同一资源

上的锁。

这是一种平衡:在失败情况下,您愿意等待锁过期的时间与在您的redis服务器上添加多少负载之间的平衡。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68855859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档