local key = KEYS[1]; -- 第1个参数,锁的key local threadId = ARGV[1]; -- 第2个参数,线程唯一标识 local releaseTime = ARGV[2]; -- 第3个参数,锁的自动释放时间 if(redis.call('exists', key) == 0) then -- 判断锁是否已存在 redis.call('hset', key, threadId, '1'); -- 不存在, 则获取锁 redis.call('expire', key, releaseTime); -- 设置有效期 return 1; -- 返回结果 end; if(redis.call('hexists', key, threadId) == 1) then -- 锁已经存在,判断threadId是否是自己 redis.call('hincrby', key, threadId, '1'); -- 如果是自己,则重入次数+1 redis.call('expire', key, releaseTime); -- 设置有效期 return 1; -- 返回结果 end; return 0; -- 代码走到这里,说明获取锁的不是自己,获取锁失败 local key = KEYS[1]; -- 第1个参数,锁的key local threadId = ARGV[1]; -- 第2个参数,线程唯一标识 if (redis.call('HEXISTS', key, threadId) == 0) then -- 判断当前锁是否还是被自己持有 return nil; -- 如果已经不是自己,则直接返回 end; local count = redis.call('HINCRBY', key, threadId, -1); -- 是自己的锁,则重入次数-1 if (count == 0) then -- 判断是否重入次数是否已经为0 redis.call('DEL', key); -- 等于0说明可以释放锁,直接删除 return nil; end;