Redis消息隊列實現(xiàn)秒殺教程
Redis消息隊列實現(xiàn)秒殺
消息隊列的應(yīng)用場景例如:秒殺、搶單功能。
下面寫個Demo簡單實現(xiàn)一下秒殺,也就是搶購。
首先創(chuàng)建一個lpush.html文件
代碼如下:
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="jquery-3.2.1.min.js" ></script>
<script>
function push(uid){
$('#msg'+uid).html('請耐心等待.......');
$.get('lpush.php',{"uid":uid},function (data){
if(data == 1 ){
$('#msg'+uid).html('搶購成功!!');
}else{
$('#msg'+uid).html('搶購失敗!!');
}
});
}
</script>
</head>
<body>
<span id="msg5"></span><br>
<input type="button" value="搶購5" onclick="push(5)"><br>
<span id="msg15"></span><br>
<input type="button" value="搶購15" onclick="push(15)"><br>
<span id="msg25"></span><br>
<input type="button" value="搶購25" onclick="push(25)"><br>
<span id="msg35"></span><br>
<input type="button" value="搶購35" onclick="push(35)"><br>
<span id="msg45"></span><br>
<input type="button" value="搶購45" onclick="push(45)"><br>
<span id="msg55"></span><br>
<input type="button" value="搶購55" onclick="push(55)"><br>
</body>
</html>
在創(chuàng)建一個lpush.php文件用來處理數(shù)據(jù)
這個文件里頭的內(nèi)容呢就是執(zhí)行入隊操作,代碼如下:
<?php
//實例化redis對象
$redis = new redis();
//連接redis,第一個參數(shù)是redis服務(wù)的IP127.0.0.1是自己的,6379是端口號
$redis->connect('127.0.0.1', 6379);
//接收ajax傳來的值,請看lpush.html
$uid = $_GET['uid'];
//入隊列
$redis->lpush('tv', $uid);
//寫一個死循環(huán)用來判斷結(jié)果
while (true) {
//守護(hù)進(jìn)程是否將所有訂單處理完畢
if ($redis->scard('tvuser') == 5) {
//判斷當(dāng)前用戶是否有對應(yīng)的訂單
if ($redis->sismember('tvuser' , $uid)) {
$flag = 1;
} else {
$flag = 0;
}
//返回給頁面
echo $flag;
//滿足條件后停止循環(huán)
break;
}
}
?>在創(chuàng)建一個守護(hù)進(jìn)程的文件pop.php
這個文件里頭的主要內(nèi)容就是去隊列里頭的值并且返回人數(shù)是否已夠,代碼如下:
<?php
//實例化redis對象
$redis = new redis();
//連接redis,第一個參數(shù)是redis服務(wù)的IP127.0.0.1是自己的,6379是端口號
$redis->connect('127.0.0.1', 6379);
//定義一個變量用來存儲循環(huán)次數(shù)
$num = 0;
//循環(huán)取值
while (true) {
//每隔一秒取一次
sleep(1);
//redis取值
$uid = $redis->rpop('tv');
//判斷取出來的UID又沒有值
if ($uid > 0) {
//有值
//create order 生成用戶對應(yīng)的訂單
echo 'order created for user ' . $uid . "\r\n";
$redis->sadd('tvuser' , $uid); //搶購成功的用戶id
//如果有值的話num會++
$num++;
} else {
//無值
//insert log
echo 'no uid ' . "\r\n";
}
//如果num值大于等于5那么循環(huán)終止,循環(huán)次數(shù)是看秒殺多少件商品來變的,這里的話我就定義了5次
if ($num >= 5) {
break;
}
}
?>我們在執(zhí)行守護(hù)進(jìn)程之前可以先把redis里的數(shù)據(jù)清空一下,以免擾亂程序執(zhí)行結(jié)果,
命令如下:

效果就是這個樣子的,在秒殺開始之前要先啟動守護(hù)進(jìn)程,
命令效果如下:

然后守護(hù)進(jìn)程啟動之后,前臺就可以來進(jìn)行秒殺了。
瀏覽器上訪問你的lpush.html,由于我們后臺設(shè)定的商品數(shù)為5,那么只能五個用戶搶購成功,第6個用戶就會提示失敗,如下圖:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis中的數(shù)據(jù)結(jié)構(gòu)和編碼詳解
本文主要和大家分享幾種Redis數(shù)據(jù)結(jié)構(gòu)詳解,希望文中的案例和代碼,能幫助到大家。2020-03-03
深度剖析Redis字符串操作指南從入門到實戰(zhàn)應(yīng)用
Redis字符串類型二進(jìn)制安全,支持文本、數(shù)字、二進(jìn)制等數(shù)據(jù),涵蓋基礎(chǔ)操作、數(shù)字計算、過期管理及分布式鎖等應(yīng)用,結(jié)合優(yōu)化策略提升系統(tǒng)性能,本文給大家介紹Redis字符串操作指南,感興趣的朋友一起看看吧2025-07-07

