直接上代码
<?php
$redis=new Redis();
$redis->connect("127.0.0.1",6379);
$redis->select(0);
$lua =getLuaLock();
$res=$redis->eval($lua,['lock','thread-002','15'],1);
if($res){
echo "获取到分布式锁...\n";
echo "开始进行业务\n";
$Num=0;
while($Num<10){
sleep(1);
$Num++;
echo $Num."\n";
}
echo "业务结束\n";
$unlock=getunLockLua();
$redis->eval($unlock,['lock','thread-002','15'],1);
echo "释放分布式锁\n";
}
$redis->close();
function getLuaLock(){
$lua= <<<EOF
local key=KEYS[1];
local threadId=ARGV[1];
local expireTime=ARGV[2];
if (redis.call('exists',key)==0) then
redis.call('hset',key,threadId,'1');
redis.call('expire',key,threadId,expireTime);
return 1;
end;
if (redis.call('hexists',key,threadId) ==1) then
redis.call('hincrby',key,threadId,'1');
redis.call('expire',key,expireTime);
return 1;
end;
return 0;
EOF;
return $lua;
}
function getunLockLua(){
$lua= <<<EOF
local key=KEYS[1];
local threadId=ARGV[1];
local expireTime=ARGV[2];
if(redis.call('HEXISTS',key,threadId)==0) then
return nil;
end;
local count=redis.call('HINCRY',key,threadId,-1);
if(count>0) then
redis.call('EXPIRE',key,expireTime);
return nil;
else
redis.call('DEL',key);
return nil;
end;
EOF;
return $lua;
}
运行效果