php高并发秒杀解决方案

版权声明:本文为博主原创文章,未经博主容许不得转载。 https://blog.csdn.net/super_runman/article/details/53037151

在秒杀、抢火车票等地方,咱们一般用遇到这样高并发的问题,下面我提供了四种解决方案:html

一、使用文件锁数据库

 

  1.  
    $fp = fopen( "order.lock", "r");
  2.  
    if(flock($fp,LOCK_EX)){
  3.  
    //..处理订单的代码
  4.  
    flock($fp,LOCK_UN);
  5.  
    }
  6.  
    fclose($fp);
————————————————————————————————————————————————————————

 

二、使用消息队列缓存

咱们经常使用到Memcacheq、Radis。服务器

好比:有100张票可供用户抢,那么就能够把这100张票放到缓存中,读写时不要加锁。 当并发量大的时候,可能有500人左右抢票成功,这样对于500后面的请求能够直接转到活动结束的静态页面。进去的500我的中有400我的是不可能得到商品的。因此能够根据进入队列的前后顺序只能前100我的购买成功。后面400我的就直接转到活动结束页面。固然进去500我的只是举个例子,至于多少能够本身调整。而活动结束页面必定要用静态页面,不要用数据库。这样就减轻了数据库的压力。并发

—————————————————————————————————————————————————————————分布式

 三、若是是分布式集群服务器,就须要一个或多个队列服务器memcached

       小米和淘宝的抢购仍是有稍许不一样的,小米重在抢的那瞬间,抢到了名额,就是你的,你就能够下单结算。而淘宝则重在付款的时候的过滤,作了多层过滤,好比要卖10件商品,他会让大于10的用户抢到,在付款的时候再进行并发过滤,一层层的减小一瞬间的并发量。
高并发

—————————————————————————————————————————————————————————post

四、使用Memcache锁
spa

 

product_lock_key 为票锁key

当product_key存在于memcached中时,全部用户均可以进入下单流程。

当进入支付流程时,首先往memcached存放add(product_lock_key, “1″),若是返回成功,进入支付流程。若是不成,则说明已经有人进入支付流程,则线程等待N秒,递归执行add操做。

相关文章
相关标签/搜索