我一直在阅读关于setnx的官方redis文档及其处理死锁的部分,并想问一个关于这部分的问题:
“如果另一个客户机,例如c5,比c4快,并且用getset操作获取了锁,那么c4 getset操作将返回一个未过期的时间戳。c4将从第一步重新开始。请注意,即使c4在未来几秒钟内稍微设置一点键,这也不是问题。”
在这个例子中,只有两个客户机在争夺一个锁,c4和c5。假设有两个以上的竞争者,c4,c5。。。一直到cx。如果c4和所有其他客户机一起到达并延长c5的锁持续时间,c5的锁持续时间是否有可能堆积到一个巨大的数量(可能永远不会结束?)?
1条答案
按热度按时间kiayqfof1#
不,超出的锁定持续时间不能“叠加”。
这里的“几秒钟”是指
GET lock.foo
查看密钥是否过期,然后执行GETSET
设置新的锁定时间。这就是竞争条件,即另一个客户机将获得这两个操作之间的锁定。不管有多少客户,如果他们遇到这种竞争条件,他们只会提前一小部分时间。如果他们后来来,他们会发现锁没有过期时,他们做的决定GET
,所以他们不会试图设置它。这个结果(c4只能少量更改c5的锁超时)确实假设所有客户机都使用相同的锁超时,通常情况就是这样。如果不是,那么c4
GETSET
可能会用完全不同的东西覆盖c5的超时。