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 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/weixin_42242253/article/details/85765659
今日推荐