PHP基于Redis简单的分布式锁实现

不考虑锁自动续期情况下的最小实现

/**
 * 加锁
 *
 * @param string $lockKey
 * @param int $ex
 * @return string|false
 */
private function lock($lockKey, $ex = 120)
{
    $token = uniqid('', true);

    $result = Redis::rawCommand(
        'set',
        $lockKey,
        $token,
        'EX',
        $ex,
        'NX'
    );

    return $result ? $token : false;
}

/**
 * 解锁
 *
 * @param string $lockKey
 * @param string $token
 * @return bool
 */
private function unlock($lockKey, $token)
{
    $lua = "
        if redis.call('get', KEYS[1]) == ARGV[1] then
            return redis.call('del', KEYS[1])
        else
            return 0
        end
    ";

    return (bool) Redis::eval($lua, 1, $lockKey, $token);
}
2 个赞