1. 程式人生 > >抽獎-搶購-秒殺解決方案分析

抽獎-搶購-秒殺解決方案分析

對資料庫產生壓力
  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
  訊息中介軟體
  高併發分流