不考虑锁自动续期情况下的最小实现
/**
* 加锁
*
* @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);
}