php+redis进程锁
/**
* 阻塞锁,已锁则暂停程序等待获得锁
* @param $key
* @param int $timeout
* @return bool
*/
public function clogLock($key, $timeout = 10)
{
$start = time();
while ($this->redis->get($key, 0)) {
if (time() - $start > $timeout) {
return false; // 超时则获取锁失败
}
usleep(3000000);// 短暂睡眠再重试,可以把时间修改短点
}
$this->redis->set($key, 1, $timeout); // 设置过期时间
return true;
}
/**
* 非阻塞锁,已锁则直接跳出
* @param $key
* @param int $timeout
* @return bool
*/
public function flock($key, $timeout = 10)
{
if ($this->redis->get($key, 0)) {
return false;
}
$this->redis->set($key, 1, $timeout); // 设置过期时间
return true;
}
/**
* 释放锁
* @param $key
* @return bool
*/
public function unlock($key)
{
return $this->redis->delete($key);
}
使用示例
try {
$producId = 1;//要锁的商品ID
if (ProcessRedis::instance()->clogLock('product_' . $producId)) {
//业务逻辑代码
}
} finally {
ProcessRedis::instance()->unlock('product_' . $producId);
}
本文为Pasa吴原创文章,转载无需和我联系,但请注明来自Pasa吴博客https://www.pasawu.top
最新评论