最近在做乙個搶禮券的小需求,需求功能點很簡單,後台錄入禮券,匯入禮券碼,前台使用者搶禮券。但是還是要考慮一些問題的,例如使用者搶禮券時如何保證多個使用者併發操作時禮券的分配問題,是否會導致乙個禮券碼被多個使用者搶到,還有考慮大併發情況下資料庫的承受能力。考慮到公司流量不是特別大的情況下做了如下兩點優化操作:
一、用redis生成限制鎖
用redis做成限制鎖,在多使用者同時請求的情況下只處理乙個使用者的請求,其他使用者等待鎖,這樣就把多執行緒變成單執行緒請求了,同樣可以避免同一禮券分配給多使用者。
/*** 限制鎖**
@return
bool
*/public function
getlock()
$setexpiretime
= $this
->
redis
->get($this
->
key);
if($setexpiretime
!==
false
&& $setexpiretime
<
time()+
1) }
$retimes
--; usleep(10000);
}return false;
}
其實在使用事務時因為事務有行級鎖,同樣可以避免同乙個禮券碼分配給多使用者。
二、使用redis實現佇列防止高併發情況下「等鎖」導致大批執行緒等不到鎖「死掉」
把所有要發出去的禮券碼使用lpush加入佇列,然後每次去請求就lpop出佇列,這樣就大併發情況下不用頻繁的去查詢資料庫。同樣在後台關閉這個禮券的時候會清除掉對應佇列
//判斷該使用者是否搶過該禮券
$code
= $conn
->fetchcolumn
('select * from table_name');
if(empty
($code
))
$codeinfo
= $this
->
redis
->lpop
($ticketlistkey
); }
}
粉嫩公主雙十一搶購,新品限量搶購
雙十一來啦 不到11月,雙十一大戰序幕就已然拉開,買買買 剁剁剁 正如火如荼進行中。和往年相比,今年雙十一 一樣卻又不一樣 一樣的是大家的購買熱情未減,不一樣的是粉嫩公主變得更貼近消費者,今年雙十一,粉嫩公主憑藉優質 健康 味美 有效等特點,送萬份好禮,更有新品限量搶購,雙色球贏免單 粉嫩公主作為女...
PHP Redis秒殺搶購
string型別 apache併發請求 c 客戶端 n請求數量 ab.exe c700 n6000 192.168 88.151 82 檔名.php redis new redis redis connect 127.0.0.1 6379 對某乙個鍵加鎖 redis watch sales redi...
簡單搶購系統設計
面試或者工作中經常能遇到類似於搶購或者是併發爭奪默寫限量資源的需求,有一些想法但是比較亂,這裡剛好整理一下。乙個搶購活動主要由這幾部分組成 2.下單 爭奪購買資格 3.支付 更新訂單狀態 頁面重新整理處理辦法 1.頁面靜態化 2.反向 快取靜態頁面 3.所需動態引數通過介面獲得,不要經過框架渲染 4...