您的位置:首页 > 数据库 > Redis

redis内存锁,PHP防止并发操作

2018-03-27 10:51 274 查看
1、redis锁代码:

/**
* 获取锁
* @param  String  $key    锁标识
* @param  Int     $expire 锁过期时间
* @return Boolean
*/
public function lock($key, $expire=5){
$is_lock = $this->_redis->setnx($key, time()+$expire);

// 不能获取锁
if(!$is_lock){
// 判断锁是否过期
$lock_time = $this->_redis->get($key);
// 锁已过期,删除锁,重新获取
if(time()>$lock_time){
$this->unlock($key);
$is_lock = $this->_redis->setnx($key, time()+$expire);
}
}
return $is_lock? true : false;
}

/**
* 释放锁
* @param  String  $key 锁标识
* @return Boolean
*/
public function unlock($key){
return $this->_redis->del($key);
}

2、业务代码(php)
//设置锁,防止多个用户并发操作连麦超出数量限制
$lockKey = CacheKeyManage::getLianMaiLockKey($partyId); //缓存key
$redis = new RedisHelperUtil();
$lock = $redis->lock($lockKey);
if(!$lock) {
for($i=0;$i<3;$i++){ //重试3次,如果3次还未获取倒锁提示繁忙
$lock = $redis->lock($lockKey);
if($lock){
break;
}
sleep(1);
}
if(!$lock){
return self::setAndReturn(ErrorCode::ERR_OTHER_ERR,'服务器获取锁获取不到,$lockKey:'.$lockKey);
}
}

doAction..... //获取到了锁,做自己的业务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存锁 高并发