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) { //守護進程是否將所有訂單處理完畢 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)建一個守護進程的文件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í)行守護進程之前可以先把redis里的數(shù)據(jù)清空一下,以免擾亂程序執(zhí)行結(jié)果,
命令如下:
效果就是這個樣子的,在秒殺開始之前要先啟動守護進程,
命令效果如下:
然后守護進程啟動之后,前臺就可以來進行秒殺了。
瀏覽器上訪問你的lpush.html,由于我們后臺設(shè)定的商品數(shù)為5,那么只能五個用戶搶購成功,第6個用戶就會提示失敗,如下圖:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis數(shù)據(jù)庫的數(shù)據(jù)傾斜詳解
Redis,英文全稱是Remote Dictionary Server(遠程字典服務(wù)),是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,需要的朋友可以參考下2023-07-07redis哨兵模式分布式鎖實現(xiàn)與實踐方式(redisson)
這篇文章主要介紹了redis哨兵模式分布式鎖實現(xiàn)與實踐方式(redisson),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03Redis教程(六):Sorted-Sets數(shù)據(jù)類型
這篇文章主要介紹了Redis教程(六):Sorted-Sets數(shù)據(jù)類型,本文講解了Sorted-Sets數(shù)據(jù)類型概述、相關(guān)命令列表、命令使用示例、應(yīng)用范圍等內(nèi)容,需要的朋友可以參考下2015-04-04