抽奖加锁 php,PHP抽奖活动加内存锁,原理是什么?

PHP抽奖活动加内存锁,原理是什么?如何实现?

public function acquire($key) {

//如果需要同时获取两个锁

if ( is_array($key) && count($key) == 2 ) {

while (TRUE) {

$res = array();

foreach($key as $k => $v) {

$res[$k] = $this->acquire($v);

if ( !$res[$k] ) {

break;

}

}

//若第一个锁未拿到则直接返回

if ( !$res[0] ) {

$err = new SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);

ErrorHandle::throwErr($err);

} elseif( !$res[1] ) {

//释放第一个锁,等待然后重试

$this->release($key[0]);

usleep(LockConfig::LOCK_TIMEWAIT);

} else {

return TRUE;

}

}

} else {

$lock_key = LockConfig::LOCK_PREFIX . $key;

$i = 0;

do {

$lock = $this->_memcache->add( $lock_key, 1, LockConfig::LOCK_TIMEOUT );

//如果第一次没有获取到锁则等待指定时间后重试

if ($i > 0) {

usleep(LockConfig::LOCK_TIMEWAIT);

}

$i++;

//超过重试次数后退出

if ($i > LockConfig::LOCK_RETRY_TIMES) {

$err = new SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);

ErrorHandle::throwErr($err);

}

} while( !$lock );

// 记录log

if ($i > 1) {

LogHelper::warning('lock.log', "Acquire lock '{$lock_key}' for {$i} times");

}

return $lock;

}

}

/**

* 释放内存锁

*

* @param string $key 内存锁去除前缀后的key值

* @return bool 释放成功返回TRUE

*/

public function release($key) {

$lock_key = LockConfig::LOCK_PREFIX . $key;

return $this->_memcache->delete($lock_key);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值