jingmei0709

对数据库产生压力
  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
  消息中间件
  高并发分流

分类:

技术点:

相关文章: