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