开发者

Redis消息队列实现秒杀教程

目录
  • Redis消息队列实现秒杀
    • 首先创建一个lpush.html文件
    • 在创建一个lpush.php文件用来处理数据
    • 在创建一个守护进程的文件pop.php
  • 总结http://www.devze.com

    Redis消息队列实现秒杀

    消息队列的应用场景例如:秒杀、抢单功能。

    下面写个Demo简单实现一下秒杀,也就是抢购。

    首先创建一个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){
    	        	$('#msg'+uid).html('请耐心等待.......');
    				$.get('lpush.php',{"uid":uid},function (data){
    					if(data == 1 ){
    						$('#msg'+uid).html('抢购成功!!');
    					}else{
    						$('#msg'+uid).html('抢购失败!!');
    					}
    				});
    			}
            </script>
        </head>
        <body>
            <span id="msg5"></span><br>
            <input type="button" value="抢购5" onclick="push(5)"><br>
            <span id="msg15"></span><br>
            <input type="button" value="抢购15" onclick="push(15)"><br>
            <span id="msg25"></span><br>
            <input type="button" value="抢购25" onclick="push(25)"><br>
            <span id="msg35"></span><br>
            <input type="button" value="抢购35" onclick="push(35)"><br>
            <span id="msg45"></span><br>
          js  <input type="button" value="抢购45" onclick="push(45)"><br>
            <span id="msg55"></span><br>
            <input type="button" value="抢购55" onclick="push(55)"><br>
        </body>
    </html>
    

    在创建一个lpush.php文件用来处理数据

    这个文件里头的内容呢就是执行入队操作,代码如下:

    <?php
        //实例化redis对象
        $redis = new redis();
        //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
        $redis->connect('127.0.0.1', 6379);
        //接收AJAX传来的值,请看lpush.html
        $uid = $_GET['uid'];
        //入队列
        $redis->lpush('tv', $uid);
        //写一个死循环用来判断结果
        while (true) {
            //守护进程是否将所有订单处理完毕
            if ($redis->scard('tvuser') == 5) {
                //判断当前用户是否有对应的http://www.devze.com订单
                if ($redis->sismember('tvuser' , $uid)) {
                    $flag = 1;
                } else {
                    $flag = 0;
                }
                //返回给页面
                echo $flag;
                //满足条件后停止循环
                break;
             }
         }
    ?>

    在创建一个守护进程的文件pop.php

    这个文件里头的主要内容就是去队列里头的值并且返回人数是否已够,代码如下:

    <?php
        //实例化redis对象
        $redis = new redis();
        //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
        $jsredis->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 . "\r\n";
                $redis->sadd('tvuser' , $uid); //抢购成功的用户id
                //如果有值的话num会编程++
                $num++;
            } else {
                //无值
                //insert log
                echo 'no uid ' . "\r\n";
            }
            //如果num值大于等于5那么循环终止,循环次数是看秒杀多少件商品来变的,这里的话我就定义了5次
            if ($num >= 5) {
                break;
            }
        }
    ?>

    我们在执行守护进程之前可以先把redis里的数据清空一下,以免扰乱程序执行结果,

    命令如下:

    Redis消息队列实现秒杀教程

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

    命令效果如下:

    Redis消息队列实现秒杀教程

    然后守护进程启动之后,前台就可以来进行秒杀了。

    浏览器上访问你的lpush.html,由于我们后台设定的商品数为5,那么只能五个用户抢购成功,第6个用户就会提示失败,如下图:

    Redis消息队列实现秒杀教程

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜