PHP項目:如何用PHP高並發檢索資料庫?

來源:互聯網
上載者:User

標籤:

對於搶票、秒殺這種業務,我說說自己對這種高並發的理解吧,這裡提出個人認為比較可行的幾個方案:

方案一:使用隊列來實現
可以基於例如MemcacheQ等這樣的訊息佇列,具體的實現方案這麼表述吧
比如有100張票可供使用者搶,那麼就可以把這100張票放到緩衝中,讀寫時不要加鎖。 當並發量大的時候,可能有500人左右搶票成功,這樣對於500後面的請求可以直接轉到活動結束的靜態頁面。進去的500個人中有400個人是不可能獲得商品的。所以可以根據進入隊列的先後順序只能前100個人購買成功。後面400個人就直接轉到活動結束頁面。當然進去500個人只是舉個例子,至於多少可以自己調整。而活動結束頁面一定要用靜態頁面,不要用資料庫。這樣就減輕了資料庫的壓力。


方案二:當有多台伺服器時,可以採用分流的形式實現
假設有m張票, 有n台產品伺服器接收請求,有x個請求路由伺服器隨機轉寄

直接給每台產品伺服器分配 m/n張票
每台產品伺服器記憶體做計數器,比如允許m/n*(1+0.1)個人進來。
當記憶體計數器已滿:
後面進的人, 直接跳到到轉到活動結束的靜態頁面,
通知路由伺服器,不在路由到這台伺服器(這個值得商討)。
所有產品伺服器進來的m/n*(1+0.1)個人再全部轉寄到一台付款服務器上,進入付款環節,看誰手快了,這時候人少,加鎖什麼的就簡單的。


方案三、如果是單伺服器,可以使用Memcache鎖來實現

product_key 為票的key 
product_lock_key 為票鎖key

當product_key存在於memcached中時,所有使用者都可以進入下單流程。
當進入支付流程時,首先往memcached存放add(product_lock_key, "1"),
如果返回成功,進入支付流程。
如果不成,則說明已經有人進入支付流程,則線程等待N秒,遞迴執行add操作。

PHP項目:如何用PHP高並發檢索資料庫?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.