win10+php+lua+docker+redis+AB測(cè)試,實(shí)現(xiàn)商品秒殺代碼實(shí)現(xiàn)
win10+php+lua+docker+redis+AB測(cè)試,實(shí)現(xiàn)商品秒殺代碼實(shí)現(xiàn)
原創(chuàng)2022-03-26 12:05·滬猿小韓
面試的時(shí)候經(jīng)常會(huì)被問到秒殺任務(wù)的設(shè)計(jì)和實(shí)現(xiàn),我之前遇到過很多次,回答得不是很好,我目前在職的公司正好有高并發(fā)的項(xiàng)目,所以結(jié)合自己公司的項(xiàng)目加上之前面試官問的一些問題。
今天就用實(shí)際代碼來實(shí)現(xiàn)一下秒殺任務(wù)簡(jiǎn)單實(shí)現(xiàn),個(gè)人認(rèn)為掌握這個(gè)方法,面試PHP中級(jí),15K-20K基本穩(wěn)妥的。
開發(fā)環(huán)境如標(biāo)題,window10,某個(gè)成就1億人的技術(shù)網(wǎng)站調(diào)查顯示大部分人還是用windows開發(fā)。后端語(yǔ)言用的PHP7.3,redis我是用的docker desktop安裝的redis6.x,windows本地也能裝,因?yàn)楸镜匚乙惭bredis集群,所以就有docker安裝redis了,redis6在windows上還不支持集群。
性能測(cè)試工具用的AB,服務(wù)器上可以用wrk性能測(cè)試;好了,這些環(huán)境的搭建我就不細(xì)說了,初級(jí)開發(fā)的話這些工具安裝應(yīng)該輕車熟路了。
直接貼代碼,展示測(cè)試結(jié)果:
docker中的redis,端口6379,RDM工具可以直接連接到docker中的redis

RDM 連接redis

AB壓測(cè)工具,壓縮包下載放到本地,解壓就可以使用,無需安裝

cmd進(jìn)入AB的bin目錄,執(zhí)行命令
ab -n 10000 -c 200 -k "http://wt.local.com/index.php"
簡(jiǎn)單解釋下,-n后面參數(shù)是請(qǐng)求次數(shù),-c并發(fā)數(shù),同時(shí)發(fā)送請(qǐng)求數(shù),看結(jié)果
存了1000個(gè)用戶id,stock庫(kù)存為0,沒有超賣,符合秒殺要求


再看下壓測(cè)結(jié)果

最重要的參數(shù)就是Requests per second 381.8也就是QPS,每秒請(qǐng)求數(shù)。個(gè)人認(rèn)為中小公司完全夠用了。
當(dāng)然我這段實(shí)例代碼是原生的,沒有使用框架,生產(chǎn)的秒殺業(yè)務(wù)不可能這么簡(jiǎn)單,比如JWT校驗(yàn),各種規(guī)則驗(yàn)證,源于這些會(huì)導(dǎo)致接口的性能下降。起碼這能解決中小流量的并發(fā)搶購(gòu),且不超賣業(yè)務(wù)。
樂觀一點(diǎn)說,我這是本地測(cè)試,redis用的是虛擬機(jī),相比生產(chǎn)的linux環(huán)境或多或少性能要差點(diǎn)。
我司用了redis主從就夠了,大公司會(huì)用到redis集群,我在docker中也安裝了集群。后續(xù)我用redis集群來實(shí)現(xiàn)秒殺,看看性能。

win10+docker+redis集群
php 操作redis有兩種方式,一種是
<?php?
$redis_config = ['127.0.0.1:6379','127.0.0.1:6380','127.0.0.1:6381'];?
$redis = new \RedisCluster(null,$redis_config);
另一種composer安裝predis擴(kuò)展

<?php?
namespace backend\controllers;
use Predis\Client;class TestController extends BaseController
{ ? ?public function actionIndex()
? ?
? ? {
? ? ? ?
? ? ? $redis_config = [ ? ? ? ? ? ?
? ? ? 'tcp://127.0.0.1:6379', ?
? ? ? 'tcp://127.0.0.1.2:6380',?
? ? ? 'tcp://127.0.0.1.3:6381'
? ? ? ?
];
??
? ? ?$redis = new Client($redis_config, ['cluster' => 'redis']);
?
?}?
}
后續(xù)測(cè)試下集群秒殺的性能,以及golang實(shí)現(xiàn)秒殺,不足之處,請(qǐng)批評(píng)指正