首页 文章

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

提问于
浏览
0

我在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 回答

  • 2

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

相关问题