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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis内存锁,PHP防止并发操作相关的知识,希望对你有一定的参考价值。


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..... //获取到了锁,做自己的业务


以上是关于redis内存锁,PHP防止并发操作的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现Redis单据锁,防止并发重复写入

PHP应对并发,MySQL数据库防止数据不一致

用 Go + Redis 实现分布式锁

PHP使用redis防止大并发下二次写入

深入Redis分布式锁

Redis高并发场景下秒杀超卖解决