秒殺這個問題,一直以來都是經典的面試題。但是秒殺也分大小。如果乙個產品的使用者不超過5w,上來就問雙十一級別的秒殺。那就沒有意思了~,所以今天就簡單聊下一般條件下的秒殺的思路。方法只有兩個,乙個是裝載秒殺商品。乙個就是模擬使用者進場秒殺。
工具介紹
首先環境就比較簡單
apache
php 7.3
redis
框架我選擇的thinkphp5.1 不過這次我主要還是選擇貼近原生的寫法
選擇apache的原因很簡單。自帶壓力測試工具ab。符合我們的需要。雖然我們知道nginx來做web伺服器效能更好。
php7.* 這個不用多介紹了php 7 和 php 5的效能不是乙個世界的
redis 雖然可以實現秒殺的方式有很多。redis算是非常常見的快取和中介軟體工具了。在效能和上手難度上都是很不錯的選擇
一.裝載秒殺商品
我們先假設我們有300個人來搶30件商品。那麼我們就在我們的商品庫裡面裝載30件不同id的商品
秒殺商品一般都是定時新增的。所以我們需要乙個定時任務控制器用cli模式執行
class crontab}}
然後當我們需要裝載商品的時候我們使用php命令去執行下我們的方法
用redis客戶端檢視下商品id是否放入成功
檢視商品id
二.秒殺商品
秒殺商品其實就是乙個將集合中的商品id取出和使用者id繫結的過程。只是這個過程進行的非常的快。那麼我們將秒殺分為兩步,如果秒殺成功,則記錄下使用者id和商品id 也就是所謂的秒殺訂單。如果秒殺失敗,我們則簡單的記錄乙個秒殺失敗的人數。來確定這次秒殺有多少有效使用者參與。
public function kill()
else
echo "success";
}
壓力測試模擬秒殺
剛剛有提到會使用apache自帶的ab做測試
小試牛刀 300併發 3000訪問量
ab -c 300 -n 3000
啥也不說就是幹
執行結果
雖說還是比較慢,但是3000次請求,是全部命中沒有死掉的使用者。加上我本身docker效能沒給到最大。加上只有單機節點。我對這個成績還是比較滿意的
下面來看看搶到商品的幸運使用者
商品和 使用者id的對應關係
再看看秒殺失敗的使用者數量
搶購失敗次數
這時候的商品list已經空空如也了。
好了,今天簡單做個秒殺,就介紹到這裡。有時候思路比實現的方法更重要。
LINQ其實很簡單
會寫這一篇是有原因的,不只一次有人問我,要不要學 linq呢?linq 看起來很難耶 為何要放棄以前的 sql來學 linq呢?到底linq 的意義是什麼 反正就是有很多的問題,說真的,由於最近也沒時間寫本 linq 的書,但是工作累了順手寫寫 blog 還可以,所已針對 linq 這個主題,和大家...
LINQ其實很簡單
會寫這一篇是有原因的,不只一次有人問我,要不要學linq呢?linq看起來很難耶 為何要放棄以前的sql來學linq呢?到底linq的意義是什麼?反正就是有很多的問題,說真的,由於最近也沒時間寫本linq的書,但是工作累了順手寫寫blog還可以,所已針對linq這個主題,和大家有一些分享。其實對於v...
快樂其實很簡單
快樂,乙個簡單而不失文雅的詞語,可真正能體會到其中真諦的又有多少呢?我們來一起 下快樂的真諦吧!快樂,其實每個人對快樂的理解都不一樣,每個人能體會到的快樂程度也不一樣。比如 放假就會讓學生覺得很快樂,週末休息會讓忙碌了一周的上班族快樂,喜歡追星的人見到偶像很快樂等等,你會發現快樂就在我們身邊,快樂並...