redis使用佇列進行搶購活動(秒殺)
阿新 • • 發佈:2019-01-04
開啟redis服務。
同一html頁面模擬多個使用者搶購,搶購名額為5。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){ $.get('lpush.php',{"uid":uid},function (data){ if(data == 1 ){ $('#msg' + uid).html('搶購成功!!'); }else{ $('#msg' + uid).html('搶購失敗!!'); } }); } </script> </head> <body> <div> <span id="msg5"></span><br> <input type="button" value="搶購5" onclick="push(5)"> <div> <hr/> <div> <span id="msg20"></span><br> <input type="button" value="搶購20" onclick="push(20)"> <div> <hr/> <div> <span id="msg15"></span><br> <input type="button" value="搶購15" onclick="push(15)"> <div> <hr/> <div> <span id="msg35"></span><br> <input type="button" value="搶購35" onclick="push(35)"> <div> <hr/> <div> <span id="msg51"></span><br> <input type="button" value="搶購51" onclick="push(51)"> <div> <hr/> <div> <span id="msg57"></span><br> <input type="button" value="搶購57" onclick="push(57)"> <div> <hr/> <div> <span id="msg44"></span><br> <input type="button" value="搶購44" onclick="push(44)"> <div> </body> </html>
點選搶購後進入lpush.php頁面,存入佇列,判斷搶購集合中是否存在該使用者,並判斷搶購活動是否結束,假設搶購名額只有5個。lpush.php程式碼如下:
<?php $redis = new redis(); $redis->connect('127.0.0.1', 6379); //入佇列 $redis->lpush('tv', $_GET['uid']); while (true) { //判斷當前使用者是否有對應的訂單 if ($redis->sismember('tvuser',$_GET['uid'])) {//時間點1 echo $flag = 1; break; } else { //守護程序是否將所有訂單處理完畢 if ($redis->scard('tvuser') == 5) {//時間點2 if(!$redis->sismember('tvuser',$_GET['uid'])){//如果仍然取不到當前使用者 echo $flag = 0; break; }else{ echo $flag = 1; break; } } }/*else{ echo '-1'; //排隊中 break; }*/ }
使用者id出隊進入集合,通過集合判斷是否搶購成功及活動是否結束。判斷同一使用者是否重複點選,rpop.php程式碼如下:
<?php $redis = new redis(); $redis->connect('127.0.0.1', 6379); //判斷使用者重複點選,只有第一次有效 $num = 0; //處理佇列中的資料 while (true) { sleep(1); $uid = $redis->rpop('tv'); if ($uid > 0) { if($redis->sadd('tvuser',$uid)){//判斷當前使用者是否是第一次點選 //create order 生成使用者對應的訂單 echo 'order created for user ' . $uid . "\r\n"; //總計處理的使用者數 $num++; }else{ echo "當前使用者重複點選,該資料丟棄" . $uid . "\r\n"; } } else { //insert log echo 'no uid ' . "\r\n"; } if ($num >= 5) { break; } } /* 未判斷使用者重複點選 $num = 0; //處理佇列中的資料 while (true) { sleep(1); $uid = $redis->rpop('tv'); if ($uid > 0) { //create order 生成使用者對應的訂單 echo 'order created for user ' . $uid . "\r\n"; $redis->sadd('tvuser',$uid); //總計處理的使用者數 $num++; } else { //insert log echo 'no uid ' . "\r\n"; } if ($num >= 5) { break; } } */ --------------------- 作者:成一方淨土 來源:CSDN 原文:https://blog.csdn.net/weixin_43184152/article/details/84567182 版權宣告:本文為博主原創文章,轉載請附上博文連結!