connect('127.0.0.1',6379);$this->redis=$redis;}/***@paramstring$name参数名*@paramint$exp过期时间*@paramint$retry重复次数*@paramint$sleep等待时间*/publicfunctionlock($name='lock',$exp=30,$retry=10,$sleep=1){$result=false;while($retry-->=0){$value=md5(date("Y-m-dH:i:s"));$result=$this->redis->set($name,$value,['NX','EX'=>$exp]);如果($result){$this->lockid[$name]=$value;回声$名字。已成功获取锁并正在执行'。"\n";休息;}echo$name.'获取锁失败。正常尝试获取锁'。\n";sleep($sleep);}return$result;}/***@param$name*@returnmixed*删除锁*/publicfunctionunlock($name){echo$name.'正常解锁...'"\n";$lua="localkey=KEYS[1]localvalue=ARGV[1]if(redis.call('get',key)==value)thenreturnredis.call('del',key)end";返回$this->redis->eval($lua,[$name,$this->lockid[$name]],1);}}//申请分布式锁$obj=newlocks();//执行后申请解锁if($obj->lock($name="lock_1")){echo"执行结束,等待5s执行解锁操作..."\n";sleep(5);echo"-------------------------".\n";$unlockResult=$obj->unlock($name);if($unlockResult){echo$name.'解锁成功··'."\n";}}Redis申请分布式锁的命令,这个命令符合原子性:/***SET:Redis的String命令*lock_name:锁的名字*unique_id:锁的唯一验证*NX:只有当lock_name的值不存在时才SETSUCCESSFUL*PX:设置过期时间*/SETlock_nameunique_idNXPXexpire_time分别执行,具体执行结果:lock($name="lock_1")){echo"执行结束,等待5s进行解锁操作..."\n";sleep(5);echo"-------------------------"."\n";$unlockResult=$obj->unlock($name);if($unlockResult){echo$name.'解锁成功··'."\n";}}客户端1:客户端2:
