【问题标题】:Question about Redis SETNX and handling deadlocks关于 Redis SETNX 和处理死锁的问题
【发布时间】:2020-12-28 00:20:29
【问题描述】:

我一直在阅读关于 SETNX 的官方 Redis 文档及其部分 Handling deadlocks 并想就这部分提出问题:

"如果另一个客户端,例如 C5,比 C4 快,并且通过 GETSET 操作获得了锁,则 C4 GETSET 操作将返回一个未过期的时间戳。C4 将简单地从第一步重新启动。请注意,即使 C4将密钥设置在未来几秒钟内这不是问题。”

在这个例子中,只有 2 个客户端在争夺锁,C4 和 C5。假设有超过 2 个竞争者,C4、C5……一直到 CX。如果 C4 和所有其他客户端一起到达并延长 C5 的锁定持续时间,C5 的锁定持续时间是否有可能堆积到大量(可能永远不会结束?)?

【问题讨论】:

    标签: redis


    【解决方案1】:

    不,多余的锁定持续时间不能“堆叠”。

    这里的“几秒”是指执行GET lock.foo 以查看密钥是否过期和执行GETSET 设置新锁定时间之间的延迟。这就是竞争条件,另一个客户端将获得这两个操作之间的锁定。无论有多少客户,如果他们遇到这种竞争条件,他们只会将时间提前一小段时间。如果他们晚一点来,他们在做GET时会发现锁没有过期,所以他们不会尝试设置它。

    这个结果(C4 只能少量改变 C5 的锁定超时)确实假设所有客户端都使用相同的锁定超时,通常情况就是这样。如果没有,那么 C4 GETSET 可以用完全不同的东西覆盖 C5 的超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多