python - 使用 GET 和 INCR 对 Redis 进行乐观锁定

标签 python redis optimistic-locking optimistic-concurrency

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

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 , EXECWATCH . 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/

相关文章:

java - 如何在 REST 中实现粗粒度乐观锁?

python - ctypes 导入不适用于 python 2.5

Python正则表达式从字符串中的 anchor 提取上一个/下一个组

python - 在不调用 __init__ 的情况下动态创建 type(self) 的实例?

apache-spark - 具有大量流和模型的 Spark Streaming 用于 RDD 的分析处理

ruby - 使用 'redis-sentinel' 配置 'sidekiq' gem

python - 零填充 3d Numpy 数组

rspec - 当在一个 RSpec 套件中调用多个 with_api() 测试时,Goliath 会破坏 em-synchrony/em-hiredis

java - Hibernate session 在初始提交失败后未刷新数据库中的数据

hibernate - 乐观锁定和可扩展性