class PublicFunc{
public static function lock($name, $ex = 60)
{
$val = uniqid();
if ($redis->set($name, $val, 'NX', 'EX', $ex)) {
register_shutdown_function(function () use ($name, $val) {
PublicFunction::unlock($name, $val);
});
} else {
throw new \Exception('执行中,请稍等');
}
}
public static function unlock($name)
{//释放锁需要先判断是否是自己持有的锁,如果是则释放,否则不释放,多不操作要求原子操作,所以需要lua脚本
static $releaseLuaScript = <<<LUA
if redis.call("GET",KEYS[1])==ARGV[1] then
return redis.call("DEL",KEYS[1])
else
return 0
end
LUA;
return $redis->eval($releaseLuaScript, 1, $name, $val);
}
}