• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Redis消息队列实现秒杀教程

    发布者: 涵韵3588 | 发布时间: 2025-6-19 12:36| 查看数: 61| 评论数: 0|帖子模式

    Redis消息队列实现秒杀

    消息队列的应用场景例如:秒杀、抢单功能。
    下面写个Demo简单实现一下秒杀,也就是抢购。

    首先创建一个lpush.html文件

    代码如下:
    1. <!DOCTYPE html>
    2. <html>
    3.     <head>
    4.         <title>TODO supply a title</title>
    5.         <meta charset="UTF-8">
    6.         <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7.         <script src="jquery-3.2.1.min.js" ></script>
    8.         <script>
    9.                         function push(uid){
    10.                         $('#msg'+uid).html('请耐心等待.......');
    11.                                 $.get('lpush.php',{"uid":uid},function (data){
    12.                                         if(data == 1 ){
    13.                                                 $('#msg'+uid).html('抢购成功!!');
    14.                                         }else{
    15.                                                 $('#msg'+uid).html('抢购失败!!');
    16.                                         }
    17.                                 });
    18.                         }
    19.         </script>
    20.     </head>
    21.     <body>
    22.         <span id="msg5"></span><br>
    23.         <input type="button" value="抢购5" onclick="push(5)"><br>
    24.         <span id="msg15"></span><br>
    25.         <input type="button" value="抢购15" onclick="push(15)"><br>
    26.         <span id="msg25"></span><br>
    27.         <input type="button" value="抢购25" onclick="push(25)"><br>
    28.         <span id="msg35"></span><br>
    29.         <input type="button" value="抢购35" onclick="push(35)"><br>
    30.         <span id="msg45"></span><br>
    31.         <input type="button" value="抢购45" onclick="push(45)"><br>
    32.         <span id="msg55"></span><br>
    33.         <input type="button" value="抢购55" onclick="push(55)"><br>
    34.     </body>
    35. </html>
    复制代码
    在创建一个lpush.php文件用来处理数据

    这个文件里头的内容呢就是执行入队操作,代码如下:
    1. <?php
    2.     //实例化redis对象
    3.     $redis = new redis();
    4.     //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
    5.     $redis->connect('127.0.0.1', 6379);
    6.     //接收ajax传来的值,请看lpush.html
    7.     $uid = $_GET['uid'];
    8.     //入队列
    9.     $redis->lpush('tv', $uid);
    10.     //写一个死循环用来判断结果
    11.     while (true) {
    12.         //守护进程是否将所有订单处理完毕
    13.         if ($redis->scard('tvuser') == 5) {
    14.             //判断当前用户是否有对应的订单
    15.             if ($redis->sismember('tvuser' , $uid)) {
    16.                 $flag = 1;
    17.             } else {
    18.                 $flag = 0;
    19.             }
    20.             //返回给页面
    21.             echo $flag;
    22.             //满足条件后停止循环
    23.             break;
    24.          }
    25.      }
    26. ?>
    复制代码
    在创建一个守护进程的文件pop.php

    这个文件里头的主要内容就是去队列里头的值并且返回人数是否已够,代码如下:
    1. <?php
    2.     //实例化redis对象
    3.     $redis = new redis();
    4.     //连接redis,第一个参数是redis服务的IP127.0.0.1是自己的,6379是端口号
    5.     $redis->connect('127.0.0.1', 6379);
    6.     //定义一个变量用来存储循环次数
    7.     $num = 0;
    8.     //循环取值
    9.     while (true) {
    10.         //每隔一秒取一次
    11.         sleep(1);
    12.         //redis取值
    13.         $uid = $redis->rpop('tv');
    14.         //判断取出来的UID又没有值
    15.         if ($uid > 0) {
    16.             //有值
    17.             //create order 生成用户对应的订单
    18.             echo 'order created for user ' . $uid . "\r\n";
    19.             $redis->sadd('tvuser' , $uid); //抢购成功的用户id
    20.             //如果有值的话num会++
    21.             $num++;
    22.         } else {
    23.             //无值
    24.             //insert log
    25.             echo 'no uid ' . "\r\n";
    26.         }
    27.         //如果num值大于等于5那么循环终止,循环次数是看秒杀多少件商品来变的,这里的话我就定义了5次
    28.         if ($num >= 5) {
    29.             break;
    30.         }
    31.     }
    32. ?>
    复制代码
    我们在执行守护进程之前可以先把redis里的数据清空一下,以免扰乱程序执行结果,
    命令如下:

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

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


    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:https://www.jb51.net/database/340120b13.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表