我在http://redis.io/topics/distlock上阅读了有关Redis分布式锁的帖子 . 有一个lua脚本来描述如何做"unlock" .
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删除密钥 .
客户A删除 -
客户B的锁定!
1 回答
不,这里没有竞争条件 . LUA脚本以原子方式执行 . 这意味着在LUA脚本完成它们之前不会处理来自其他连接(客户端)的任何命令(甚至Redis内部cron实际上处理过期的项目) .