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

标签 redis distributed-lock

我已经在 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

我认为这个模型存在竞争条件:

  1. 客户端 A 获得 3 秒到期的锁。 设置 key randomstring1 NX PX 3000
  2. 睡了 2.99 秒。
  3. 客户端A释放锁并调用上述代码。
  4. 条件为真。 if redis.call("get",KEYS[1]) == ARGV[1] then
  5. 原始 key 过期
  6. 客户端 B 获得了 anthor 锁。 设置 key randomstring2 NX PX 3000
  7. 客户端A删除 key 。
  8. 客户端B的锁被客户端A删除了!

最佳答案

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

关于redis - 使用 Redis 的分布式锁中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34868020/

相关文章:

ruby - sinatra 应用程序的多个 sidekiq 队列

database - 确定大型 redis 数据库中未使用键的百分比

java - Curator Hierarchy Locking(重叠锁)

java - 分布式锁服务

java - 如何设置Redisson分布式锁的最大许可数

php - Redis nodejs 获取过滤器

caching - Redis 缓存未命中行为

php - PHP 中的 Redis : keys "*"

mysql - 通过 redisson 避免重复行