<?php
namespace app\api\service;
use app\api\traits\Singleton;
/**
* 分布式锁
* Class LockService
* @package app\api\service
*/
class LockService extends BaseService
{
private $lockValue;
//有效期,5秒钟
private $expireTime = 5;
//使用场景
private $scene;
//redis连接实例
private $redis;
public function __construct($scene = 'kill', $expireTime = 5)
{
$this->scene = $scene;
$this->expireTime = $expireTime;
$this->redis = RedisService::getInstance()->client();
}
//加锁
public function lock()
{
$this->lockValue = md5(uniqid());
$result = $this->redis->set($this->scene, $this->lockValue,
'EX', $this->expireTime,'NX');
if(empty($result)){
return false;
}
return true;
}
//释放锁
public function unlock()
{
$script = <<<LUA
local key=KEYS[1]
local value=ARGV[1]
if(redis.call('get', key) == value)
then
return redis.call('del', key)
end
LUA;
$this->redis->eval($script, 1, $this->scene, $this->lockValue);
}
}
/*
//调用执行
$lockService = new LockService('kill');
if($lockService->lock()){
//自行相关操作
//释放锁
$lockService->unlock();
}
else{
echo "请求频繁,请稍后再操作\n";
}
*/