首頁 後端開發 php教程 PHP解決搶購、秒殺、搶樓、抽獎等阻塞式高併發庫存防控超量的思路方法

PHP解決搶購、秒殺、搶樓、抽獎等阻塞式高併發庫存防控超量的思路方法

Jul 29, 2016 am 09:13 AM
flock lock product quot

如今在電商產業裡,秒殺搶購活動已經是商家常用促銷手段。但是庫存數量有限,同時下單人數超過了庫存量,就會導致商品超賣甚至庫存變負數的問題。
又例如:搶購火車票、論壇搶樓、抽獎甚至爆紅微博評論等也會引發阻塞式高並發問題。如果不做任何措施可能在高瞬間造成伺服器癱瘓,如何解決這個問題?
這裡提出個人認為比較可行的幾個思路方法:

方案一:使用消息隊列來實現

可以基於例如Meache表述吧例如有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進入下單流程。
當進入支付流程時,首先往memcached存放add(product_lock_key, “1″),
如果返回成功,進入支付流程。
如果不成,則表示已經有人進入支付流程,則執行緒等待N秒,遞歸執行add操作。

方案四、借助文件排他鎖

在處理下單請求的時候,用flock鎖定一個文件,如果鎖定失敗說明有其他訂單正在處理,此時要么等待要么直接提示用戶"服務器"
本文要說的是第4種方案,大致程式碼如下

阻塞(等待)模式:
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
?>
登入後複製

以上就介紹了PHP解決搶購、秒殺、搶樓、抽獎等阻塞式高並發庫存防控超量的思路方法,包括了隊列,秒殺,人數,計數器方面的內容,希望對PHP教程有興趣的朋友有所幫助。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Java多執行緒中Lock怎麼使用 Java多執行緒中Lock怎麼使用 May 12, 2023 pm 02:46 PM

Jdk1.5以後,在java.util.concurrent.locks套件下,有一組實現線程同步的介面和類,說到線程的同步,可能大家都會想到synchronized關鍵字,這是java內建的關鍵字,用來處理線程同步的,但這個關鍵字有很多的缺陷,使用起來也不是很方便和直觀,所以就出現了Lock,下面,我們就來對比著講解Lock。通常我們在使用synchronized關鍵字的時候會遇到下面這些問題:(1)不可控性,無法做到隨心所欲的加鎖和釋放鎖。 (2)效率比較低下,例如我們現在並發的讀兩個文件,讀與讀之

Linux 中的檔案鎖定指令:flock、fcntl、lockfile、flockfile 詳細教學! Linux 中的檔案鎖定指令:flock、fcntl、lockfile、flockfile 詳細教學! Feb 23, 2024 pm 09:01 PM

在Linux中,有幾種常用的檔案鎖定指令,包括flock、fcntl、lockfile和flockfile。這些命令用於在多進程或多執行緒環境中對檔案進行互斥存取。以下是這些指令的詳細教學:flock指令:flock指令可以在Shell腳本中使用,用於對檔案進行獨佔鎖定。使用以下語法來鎖定檔案:flock[選項]檔案名稱命令例如,要鎖定名為file.txt的檔案並執行命令,可以執行以下命令:flockfile.txtls-lflock命令會在執行命令期間鎖定文件,並在指令完成後自動釋放鎖定。 fcnt

Java中Lock的使用方式有哪些? Java中Lock的使用方式有哪些? Apr 23, 2023 pm 08:52 PM

1.作用(1)Lock方式來獲取鎖支援中斷、超時不獲取、是非阻塞的(2)提高了語義化,哪裡加鎖,哪裡解鎖都得寫出來(3)Lock顯式鎖可以給我們帶來很好的靈活性,但同時我們必須手動釋放鎖定(4)支援Condition條件物件(5)允許多個讀取線程同時存取共享資源2.lock用法//獲取鎖定voidlock()//如果當前線程未中斷,則取得鎖定voidlockInterruptibly()//傳回綁定至此Lock實例的新Condition實例ConditionnewCondition()//僅在呼叫時鎖定

SpringBoot怎麼載入多個設定檔實作dev、product多環境切換 SpringBoot怎麼載入多個設定檔實作dev、product多環境切換 May 12, 2023 pm 11:58 PM

1.SpringBoot中實作多環境切換在SpringBoot中,除了application.properties,我們新建的其他設定檔的檔名需要滿足application-{profile}.properties的格式,其中{profile}對應你的環境識別(不一定是.properties文件,也可以是.yml)其對應的{profile}值是開發者自訂的(如dev,product),在專案啟動的時候,只需要加入對應的參數,springboot就會去讀取該設定檔了。具體profile的配

Java Lock類別提供哪些功能? Java Lock類別提供哪些功能? Apr 21, 2023 am 08:16 AM

說明1、Lock是java.util.concurent套件下的接口,定義了一系列的鎖定操作方法。 2.Lock介面主要包括ReentrantLock、ReentrantReadWriteLock、ReentrantReadWriteLock、WriteLock實作類別。與Synchronized不同,Lock提供了取得鎖定、釋放鎖定等相關介面,使其使用更加靈活,操作更加複雜。實例ReentrantReadWriteLocklock=newReentrantReadWriteLock();Lockread

Java中為什麼需要提供Lock,而不只使用synchronized關鍵字? Java中為什麼需要提供Lock,而不只使用synchronized關鍵字? Apr 20, 2023 pm 05:01 PM

摘要:在Java中提供了synchronized關鍵字來保證只有一個執行緒能夠存取同步程式碼區塊。既然已經提供了synchronized關鍵字,為何在Java的SDK包中,還會提供Lock介面呢?這是不是重複造輪子,多此一舉呢?今天,我們就一起來探討下這個問題。在Java中提供了synchronized關鍵字來保證只有一個執行緒能夠存取同步程式碼區塊。既然已經提供了synchronized關鍵字,為何在Java的SDK包中,還會提供Lock介面呢?這是不是重複造輪子,多此一舉呢?今天,我們就一起來探討下

java中lock取得鎖定的方法有哪些 java中lock取得鎖定的方法有哪些 May 19, 2023 pm 01:13 PM

1.取得方法lock()、tryLock()、tryLock(longtime,TimeUnitunit)和lockInterruptibly()都是用來取得鎖的。 (1)lock()方法是平常使用得最多的一個方法,就是用來取得鎖。如果鎖已被其他線程獲取,則進行等待。 (2)tryLock()方法是有回傳值的,它表示用來嘗試取得鎖,如果取得成功,則傳回true,如果取得失敗(即鎖已被其他執行緒取得),則傳回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那裡等待。 (3)tryLoc

See all articles