抽奖-抢购-秒杀解决方案分析

对数据库产生压力
  apache自带测试压力工具 ab -c 250 -n 600
    250表示并发数
    600表示请求数
  竞争状态下-->库存的正确减少(超卖)
  产生原因:
    mysql速度问题
    没有对抢购做限制,监视
    前端方案:缓存 扩容 流量限制
  解决方案
    1.文件锁->共享锁(LOCK_SH),排它锁(LOCK_EX)
      $lockFile='lock.lock';
      if(file_exists($lockFile)){
        if(time()-filemtime($lockFile) > 600){
          unlink($lockFile);
        }
      }
      //两种情况(flock) 阻塞模式 非阻塞模式
      $fp=fopen('lock.txt','W+');
      if(flock($fp,LOCK_EX)){
        //处理订单
        flock($fp,LOCK_UN);
      }
      fclose($fp);
    2.使用消息队列redis
      快的原因:mysql是磁盘比缓存慢的多 单线程 非关系型
      使用生产者消费模式-->1,多个
      1)发布订阅者模式
        $redis=new Redis;
        $result=$redis->connect('127.0.0.1','6379');
        foreach($ids as $id){
          $redis->lPush('send_list',$id);
        }
      2)乐观锁(监听销量)
        $redis=new Redis;
        $redis->connect('127.0.0.1','6379')
        $redis->watch('count');
        $count=$redis->get('count');
        $num=2
        if($count>=$num){
          exit('活动结束');
        }
        $redis->multi();//开启事务之后才会将命令放入到队列中,不执行
        $redis->set('count',$count+1);
        sleep(1);
        $res=$redis->exec();//按命令放入先后顺序执行,如果监视的数据被修改,则执行命令失败

        set
        watch
        get


  //永久执行
  //守护进程
分布式集群服务器--一个或者多个队列服务器
  分布式缓存
  分布式RPC
  消息中间件
  高并发分流

猜你喜欢

转载自www.cnblogs.com/jingmei0709/p/9956301.html