Redis消息队列实现秒杀
消息队列的应用场景例如:秒杀、抢单功能。
下面写个Demo简单实现一下秒杀,也就是抢购。
首先创建一个lpush.html文件
代码如下:
TODO supply a title
function push(uid){
$('#msg'+uid).html('请耐心等待.......');
$.get('lpush.php',{"uid":uid},function (data){
if(data == 1 ){
$('#msg'+uid).html('抢购成功!!');
}else{
$('#msg'+uid).html('抢购失败!!');
}
});
}
在创建一个lpush.php文件用来处理数据
这个文件里头的内容呢就是执行入队操作,代码如下:
connect('127.0.0.1', 6379);
//接收ajax传来的值,请看lpush.html
$uid = $_GET['uid'];
//入队列
$redis->lpush('tv', $uid);
//写一个死循环用来判断结果
while (true) {
//守护进程是否将所有订单处理完毕
if ($redis->scard('tvuser') == 5) {
//判断当前用户是否有对应的订单
if ($redis->sismember('tvuser' , $uid)) {
$flag = 1;
} else {
$flag = 0;
}
//返回给页面
echo $flag;
//满足条件后停止循环
break;
}
}
?>
在创建一个守护进程的文件pop.php
这个文件里头的主要内容就是去队列里头的值并且返回人数是否已够,代码如下:
connect('127.0.0.1', 6379);
//定义一个变量用来存储循环次数
$num = 0;
//循环取值
while (true) {
//每隔一秒取一次
sleep(1);
//redis取值
$uid = $redis->rpop('tv');
//判断取出来的UID又没有值
if ($uid > 0) {
//有值
//create order 生成用户对应的订单
echo 'order created for user ' . $uid . "rn";
$redis->sadd('tvuser' , $uid); //抢购成功的用户id
//如果有值的话num会++
$num++;
} else {
//无值
//insert log
echo 'no uid ' . "rn";
}
//如果num值大于等于5那么循环终止,循环次数是看秒杀多少件商品来变的,这里的话我就定义了5次
if ($num >= 5) {
break;
}
}
?>
我们在执行守护进程之前可以先把redis里的数据清空一下,以免扰乱程序执行结果,
命令如下:

效果就是这个样子的,在秒杀开始之前要先启动守护进程,
命令效果如下:

然后守护进程启动之后,前台就可以来进行秒杀了。
浏览器上访问你的lpush.html,由于我们后台设定的商品数为5,那么只能五个用户抢购成功,第6个用户就会提示失败,如下图:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。
