【问题标题】:Optimistic locking with redis using GET and INCR使用 GET 和 INCR 对 redis 进行乐观锁定
【发布时间】:2014-07-02 10:19:36
【问题描述】:

我想乐观地“锁定”一段代码。 伪代码如下:

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 都是原子的。 您认为这种方法有什么问题吗?

【问题讨论】:

    标签: python redis optimistic-locking optimistic-concurrency


    【解决方案1】:

    这种方法存在一些问题。首先,它不会远远超过 2 名工人,因为速度越快的工人会饿死越慢。流程也缺乏原子性,这可能是也可能不是问题,具体取决于您正在运行的逻辑,但竞争条件很糟糕。最后,这里有一点 observer effect 的作用,因为你总是在 INCRing key_lock。

    更好的方法是使用 Redis 的 MULTIEXECWATCH。 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
    

    【讨论】:

    • &lt;&lt;block of code&gt;&gt;不应该在MULTIEXEC之间,WATCHMULTI之间不应该什么都没有吗?
    • 不,OP没有说明block里面有Redis操作
    猜你喜欢
    • 2016-09-23
    • 2021-09-27
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多