【发布时间】: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
我认为这个模型存在竞争条件:
- 客户端 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 删除!
【问题讨论】: