溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php商城秒殺功能如何實(shí)現(xiàn)

發(fā)布時(shí)間:2022-10-18 11:05:01 來(lái)源:億速云 閱讀:125 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“php商城秒殺功能如何實(shí)現(xiàn)”,在日常操作中,相信很多人在php商城秒殺功能如何實(shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”php商城秒殺功能如何實(shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

php商城秒殺功能的實(shí)現(xiàn)方法:1、打開(kāi)php文件,連接redis數(shù)據(jù)庫(kù);2、創(chuàng)建待搶購(gòu)商品的list列表;3、模擬用戶請(qǐng)求并設(shè)置隨機(jī)獲取10名用戶表示搶購(gòu)成功;4、判斷搶購(gòu)列表中是否已存在該用戶并獲取列表中所有的數(shù)據(jù);5、將redis中已搶購(gòu)的用戶保存到數(shù)據(jù)庫(kù)中即可。

本教程操作環(huán)境:windows7系統(tǒng)、PHP8.1版、DELL G3電腦

php+redis實(shí)現(xiàn)秒殺功能,可緩解瞬時(shí)并發(fā)對(duì)mysql的壓力

undefinedundefinedundefinedundefinedundefinedundefinedundefinedundefined

場(chǎng)景:在某個(gè)時(shí)間點(diǎn)對(duì)商品goods_id=2的商品進(jìn)行搶購(gòu),商品庫(kù)存為10

建立商品goods_id=2的庫(kù)存搶購(gòu)列表

首先創(chuàng)建待搶購(gòu)商品的list列表,如果有人搶購(gòu)成功就移除一個(gè),直到列表為空則表示搶購(gòu)?fù)瓿伞?/p>

//1、連接redis數(shù)據(jù)庫(kù)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis_name = 'goods_id_2';//比如商品id=2的商品參與秒殺
//2、模擬搶購(gòu),庫(kù)存為10,將庫(kù)存放到redis中
$num = 10;
for($i=0;$i<$num;$i++){
$redis->lPush($redis_name,1);//這里用某個(gè)商品的ID作為標(biāo)識(shí)
}
echo "執(zhí)行成功";

php商城秒殺功能如何實(shí)現(xiàn)

客戶端進(jìn)行模擬搶購(gòu)

//1、連接redis數(shù)據(jù)庫(kù)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis_name = 'goods_id_2';//比如商品id=2的商品參與秒殺
//3、模擬用戶請(qǐng)求,隨機(jī)獲取10名用戶表示搶購(gòu)成功
for($i=0;$i<100;$i++){
$user_id = rand(100,999);
$len = $redis->lLen($redis_name);
$str = "";
if(!$len || $len<=0){
$str .= $user_id."搶購(gòu)已結(jié)束";
break;
}else{
$redis_user_name = "goods_id_2_user_id";
//判斷搶購(gòu)列表中是否已存在該用戶,獲取列表中所有的數(shù)據(jù)
$skill_list = $redis->lrange($redis_user_name, 0, -1);
if(in_array($user_id, $skill_list)){
$str .= $user_id."請(qǐng)勿重復(fù)提交";
}else{
$redis->rPop($redis_name);
$redis->lPush($redis_user_name,$user_id."_".ceil(microtime(true)*1000));
$str .= $user_id."已搶到";
}
}
file_put_contents("D:/wwwroot/test/skill/cron.txt", $str."\r\n",FILE_APPEND);
}
echo '執(zhí)行完成';

php商城秒殺功能如何實(shí)現(xiàn)

服務(wù)端執(zhí)行隊(duì)列處理,將redis中已搶購(gòu)的用戶保存到數(shù)據(jù)庫(kù)中

<?php
$mysql_server_name = 'localhost'; //改成自己的mysql數(shù)據(jù)庫(kù)服務(wù)器
$mysql_username = 'root'; //改成自己的mysql數(shù)據(jù)庫(kù)用戶名
$mysql_password = '123456'; //改成自己的mysql數(shù)據(jù)庫(kù)密碼
$mysql_database = 'test'; //改成自己的mysql數(shù)據(jù)庫(kù)名
$conn=mysqli_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_database); //連接數(shù)據(jù)庫(kù)
//連接數(shù)據(jù)庫(kù)錯(cuò)誤提示
if (mysqli_connect_errno($conn)) {
die("連接 MySQL 失敗: " . mysqli_connect_error());
}
mysqli_query($conn,"set names utf8"); //數(shù)據(jù)庫(kù)編碼格式
//1、連接redis數(shù)據(jù)庫(kù)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis_name = 'goods_id_2';//比如商品id=2的商品參與秒殺
//2、將list隊(duì)列中的數(shù)據(jù)讀取出來(lái)然后執(zhí)行入庫(kù)
$redis_user_name = "goods_id_2_user_id";
while(true){
//判斷搶購(gòu)列表中是否已存在該用戶,獲取列表中所有的數(shù)據(jù)
$result = $redis->rpop($redis_user_name);
if($result){
$skill_arr = array_filter(explode("_", $result));
$sql = "insert into skill (user_id,timestamp) values({$skill_arr[0]},{$skill_arr[1]})";
mysqli_query($conn,$sql);
}
}
echo "執(zhí)行成功";

undefinedundefinedundefinedundefinedundefinedundefinedundefined

php商城秒殺功能如何實(shí)現(xiàn)

到此,關(guān)于“php商城秒殺功能如何實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI