使用Redis的分布式锁中的竞争条件

时间:2016-01-19 03:25:14

标签: redis distributed-lock

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

arrInArr

我认为这种模式存在竞争条件:

  1. 客户端A以3秒到期获取锁定。 if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
  2. 睡觉2.99秒。
  3. 客户端A释放锁并调用上述代码。
  4. 条件是真的。 SET key randomstring1 NX PX 3000
  5. 原始密钥到期
  6. 客户B获得了anthor锁。 if redis.call("get",KEYS[1]) == ARGV[1] then
  7. 客户端A删除密钥。
  8. 客户A锁定客户B的锁定!

1 个答案:

答案 0 :(得分:2)

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