【问题标题】:Race condition in distributed locks with RedisRedis 分布式锁的竞争条件
【发布时间】:2016-01-19 03:25:13
【问题描述】:

我在http://redis.io/topics/distlock 上阅读了有关 Redis 分布式锁的帖子。有一个 lua 脚本来描述如何“解锁”。

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

我认为这个模型存在竞争条件:

  1. 客户端 A 在 3 秒到期时获取锁。 SET key randomstring1 NX PX 3000
  2. 睡眠 2.99 秒。
  3. 客户端A释放锁并调用上述代码。
  4. 条件为真。 if redis.call("get",KEYS[1]) == ARGV[1] then
  5. 原始密钥过期
  6. 客户端 B 获取 anthor 锁。 SET key randomstring2 NX PX 3000
  7. 客户端 A 删除密钥。
  8. 客户端 B 的锁被客户端 A 删除!

【问题讨论】:

    标签: redis distributed-lock


    【解决方案1】:

    不,这里没有竞争条件。 LUA 脚本以原子方式执行。这意味着在 LUA 脚本完成工作之前,不会处理来自其他连接(客户端)的任何命令(即使是实际处理过期项目的 Redis 内部 cron)。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多