关于redis setnx和死锁处理的问题

46qrfjad  于 2021-06-07  发布在  Redis
关注(0)|答案(1)|浏览(370)

我一直在阅读关于setnx的官方redis文档及其处理死锁的部分,并想问一个关于这部分的问题:
“如果另一个客户机,例如c5,比c4快,并且用getset操作获取了锁,那么c4 getset操作将返回一个未过期的时间戳。c4将从第一步重新开始。请注意,即使c4在未来几秒钟内稍微设置一点键,这也不是问题。”
在这个例子中,只有两个客户机在争夺一个锁,c4和c5。假设有两个以上的竞争者,c4,c5。。。一直到cx。如果c4和所有其他客户机一起到达并延长c5的锁持续时间,c5的锁持续时间是否有可能堆积到一个巨大的数量(可能永远不会结束?)?

kiayqfof

kiayqfof1#

不,超出的锁定持续时间不能“叠加”。
这里的“几秒钟”是指 GET lock.foo 查看密钥是否过期,然后执行 GETSET 设置新的锁定时间。这就是竞争条件,即另一个客户机将获得这两个操作之间的锁定。不管有多少客户,如果他们遇到这种竞争条件,他们只会提前一小部分时间。如果他们后来来,他们会发现锁没有过期时,他们做的决定 GET ,所以他们不会试图设置它。
这个结果(c4只能少量更改c5的锁超时)确实假设所有客户机都使用相同的锁超时,通常情况就是这样。如果不是,那么c4 GETSET 可能会用完全不同的东西覆盖c5的超时。

相关问题