我在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
我认为这个模型存在竞争条件:
- 客户端 A 在 3 秒到期时获取锁。
SET key randomstring1 NX PX 3000
- 睡眠 2.99 秒。
- 客户端 A 释放锁并调用上述代码。
- 条件为真。
if redis.call("get",KEYS[1]) == ARGV[1] then
- 源密钥过期
- 客户端 B 获得 anthor 锁。
SET key randomstring2 NX PX 3000
- 客户端 A 删除密钥。
- 客户端 B 的锁被客户端 A 删除了!