接口并发调用,且用到公共元素是需要加锁的,使用redis实现很简单


其实就是用到了setnx key命令,设置成功即获取到锁


使用expire key seconds 命令,设置失效时间防止死锁


使用del key 命令,归还锁


直接上代码


$lockKey = 'lock'     //锁名
$lockExpire = 60;     //锁失效时间 


$status = true;
while ($status) {

    //使用时间戳+失效时间作为锁的值
    $lockValue = time() + $lockExpire;
    
    //尝试获取锁
    $lock = $redis->setnx($lockKey, $lockValue);

    if (    !empty($lock) ||         //$lock不为空则获取成功
            (
                //防止死锁
                $redis->get($lockKey) < time() && 
                $redis->getSet($lockKey, $lockValue) < time()
            )
    ) {
    
        //已获取到锁,设置失效时间
        $redis->expire($lockKey, $lockExpire);

        //执行业务操作
        
        
        
        //执行业务操作
        

        //归还锁
        if ($redis->ttl($lockKey))
            $redis->del($lockKey);
            
        $status = FALSE;
    } else {
        sleep(1);
    }
}


个人网站运营不易ヾ(◍°∇°◍)ノ゙如果有帮到你赞助一下吧

Kevin博客
  • 最新评论
  • 总共0条评论