关于php 高并发解决的一点思路

时间:2017-04-26

乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能

  • 乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方

  • 3.根据update结果来判断,我们可以在sql2的时候加一个判断条件update table set 库存=xxx where 库存>0,如果返回false,则说明库存不足,并回滚事务。
    4.借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

    大致代码如下:
    阻塞(等待)模式

    <?php
    $fp = fopen("lock.txt", "w+");
    if(flock($fp,LOCK_EX))  //锁定当前指针,,,
    {
     //..处理订单
     flock($fp,LOCK_UN);
    }
    fclose($fp);
    ?>

    非阻塞模式

    <?php
    $fp = fopen("lock.txt", "w+");
    if(flock($fp,LOCK_EX | LOCK_NB))
    {
     //..处理订单
     flock($fp,LOCK_UN);
    }
    else
    {
     echo "系统繁忙,请稍后再试";
    }
     
    fclose($fp);
    ?>

    5.如果是分布式集群服务器,就需要一个或多个队列服务器 小米和淘宝的抢购还是有稍许不同的,小米重在抢的那瞬间,抢到了名额,就是你的,你就可以下单结算。而淘宝则重在付款的时候的过滤,做了多层过滤,比如要卖10件商品,他会让大于10的用户抢到,在付款的时候再进行并发过滤,一层层的减少一瞬间的并发量。

    6.使用redis锁 product_lock_key 为票锁key 当product_key存在于redis中时,所有用户都可以进入下单流程。 当进入支付流程时,首先往redis存放sadd(product_lock_key, “1″),如果返回成功,进入支付流程。如果不成,则说明已经有人进入支付流程,则线程等待N秒,递归执行sadd操作。

    当然类似于淘宝双11的疯抢架构远远比我说滴这些复杂多啦....更多解决方案需要不停滴去实战中获取心得....大家有好的解决思路清随时共享留言哈

  • 共2页:
  • 上一页
  • 2/2下一篇
    上一篇:IIS 7.5 asp Session超时时间设置方法 下一篇:PHP无限极分类函数的实现方法详解

    相关文章

    最新文章