Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用GET和INCR实现redis的乐观锁定_Python_Redis_Optimistic Locking_Optimistic Concurrency - Fatal编程技术网

Python 使用GET和INCR实现redis的乐观锁定

Python 使用GET和INCR实现redis的乐观锁定,python,redis,optimistic-locking,optimistic-concurrency,Python,Redis,Optimistic Locking,Optimistic Concurrency,我希望乐观地“锁定”一块代码。 psuedo代码如下所示: 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 revision=GET('lock_key')#默认为0 { }

我希望乐观地“锁定”一块代码。 psuedo代码如下所示:

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
revision=GET('lock_key')#默认为0
{
}
新修订版=增量(“锁定键”)
如果是新版本!=修订版+1:
引发异常#现在重试或其他任何操作
这对我来说很好,因为INCR和GET都是原子的。
你认为这种方法有什么问题吗?

这种方法有一些问题。首先,它的规模不会超过2名工人,因为速度越快,饿死速度越慢。流也缺乏原子性,这可能是一个问题,也可能不是一个问题,取决于你运行的逻辑,但比赛条件是恶劣的。最后,这里有一点不对劲,因为你总是把钥匙锁上

更好的方法是使用Redis’和。Redis’非常简洁地讨论了这一点,并根据您的psuedo代码提供了以下示例:

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
WATCH('lock\u key'))
revision=GET('lock_key')#默认为0
{
}
多()
新修订版=增量(“锁定键”)
如果EXEC()为无:
引发异常#现在重试或其他任何操作

难道
不应该在
MULTI
EXEC
之间,并且
WATCH
MULTI
之间不应该有任何内容吗?不,OP没有指示块中有任何Redis操作