1. 程式人生 > >redis使用佇列進行搶購活動(秒殺)

redis使用佇列進行搶購活動(秒殺)

開啟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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!