我想乐观地“锁定”一段代码。 伪代码如下:
revision = GET('lock_key') # default as 0
{
<<block of code>>
}
new_revision = INCR('lock_key')
if new_revision != revision + 1:
raise Exception # now retry or whatever
这对我来说很好,因为 INCR 和 GET 都是原子的。 您认为这种方法有什么问题吗?
最佳答案
这种方法存在一些问题。首先,它不会超过 2 个 worker ,因为速度快的会饿死速度慢的。该流程还缺乏原子性,这可能会或可能不会成为问题,具体取决于您正在运行的逻辑,但竞争条件很糟糕。最后,有一点 observer effect在这里玩,因为你总是 INCRing key_lock。
更好的方法是使用 Redis 的 MULTI , EXEC和 WATCH . Redis 的 transactions topic非常巧妙地讨论了这一点,并根据您的伪代码提供了以下示例:
WATCH('lock_key')
revision = GET('lock_key') # default as 0
{
<<block of code>>
}
MULTI()
new_revision = INCR('lock_key')
if EXEC() is None:
raise Exception # now retry or whatever
关于python - 使用 GET 和 INCR 对 Redis 进行乐观锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23653327/