• redis集合 实现 队列


    先说一下需求:用队列解决 流量削峰,主要应用场景:商城秒杀功能。

       以下是业务流程图可以参考一下:

    然后本地实现思路

    截图下单页面

    每次购买数量会减少1,设置了1000个库存,用户id 是随机生成的。

     

    本地代码目录

     附上代码:

    index.php

    <?php
    #连接redis
    $redis = new redis();
    $result = $redis->connect('127.0.0.1', 6379);
    // var_dump($result); //结果:bool(true)
    // var_dump($redis->lpush("goods","111")); //结果:int(1)
    // var_dump($redis->lpush("goods","222")); //结果:int(2)
    // var_dump($redis->lsize("goods")); //结果:int(4)
    // var_dump($redis->lremove('goods','a',2)); //结果:int(2)
    //print_r($redis->lgetrange("uid",0,-1)); // 查询所有的数据
    //print_r($redis->lgetrange('uid',$redis->lsize("uid")-2,-1));

    ?>

    <?php
    #处理交互逻辑
    $rand_uid = time().'_'.mt_rand(10000,99999);
    $total = $redis->lsize("uid");
    $surplus = 1000-$total;
    // $total = 10;
    if($_GET['uid']){
    if($surplus<=0){
    echo"<script>alert('当前商品库存不足,请明天再来');window.location.href='http://duilie.com'</script>";die;
    }
    # 把成功的用户id 写入 redis 集合
    $redis->lpush('uid',$_GET['uid']);
    echo "<script>alert('下单成功');window.location.href='http://duilie.com'</script>";
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>队列模拟下单</title>
    <style>
    .goods_box{border: 1px solid #e8e8e8;
    600px;
    height: 400px;
    overflow: hidden;padding:10px;margin-bottom:10px;
    }
    img{300px;
    }
    </style>
    </head>
    <body>
    <h2>当前用户<?php echo $rand_uid ?></h2>
    <div class="goods_box">
    <p><marquee>redis 集合 实现队列 利用定时脚本处理订单业务 入库。。。</marquee></p>
    <p>快乐大芒果<p/>
    <p>
    <img src="./static/mangguo.jpg" />
    </p>
    <p>价格:19.8/kg</p>
    <p>已购买数量:<?php echo $total ?> ,剩余数量:<span style="color:red"><?php echo 1000-$total;?></span></p>
    </div>
    <form action="" method="get">
    <input type="hidden" name="uid" value="<?php echo $rand_uid ?>" />
    <input type="hidden" name="good_name" value="快乐大芒果" />
    <input type="submit" value="立即抢购" />
    </form>
    </body>
    </html>

    ---------------------------

    crontab.php代码:

    <?php
    $link = mysqli_connect(
    '127.0.0.1', /* The host to connect to 连接MySQL地址 */
    'root', /* The user to connect as 连接MySQL用户名 */
    'root', /* The password to use 连接MySQL密码 */
    'duilie'); /* The default database to query 连接数据库名称*/

    if (!$link) {
    printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error());
    exit;
    }else{
    # 查询到队列的数据每次处理2条
    $redis = new redis();
    $result = $redis->connect('127.0.0.1', 6379);

    $rs = $redis->lgetrange('uid',$redis->lsize("uid")-2,-1);// 获取最后2个值,队列 先进先出
    // print_r($rs);
    foreach($rs as $k=>$v){
    $values .= "('{$v}','快乐大芒果'),";
    #清除掉这些数据
    $redis->lremove('uid',$v,-1);
    }
    $values = trim($values,',');
    $sql="insert into `order`(uid,good_name) values $values";

    if ($link->query($sql) == TRUE) {
    echo "成功插入";
    file_put_contents('crontab.log',date('Y-m-d H:i:s',time()).'执行了一次定时任务。'.PHP_EOL,FILE_APPEND);

    } else {
    echo "插入失败" ;
    }
    }

    ----------------------------

    crontab.bat 代码

    N:
    "E:phpEnvphpphp-72php.exe" -f "E:phpEnvwwwduiliecrontabcrontab.php"

    说明一下:

    E:phpEnvphpphp-72php.exe  // 是php路径

    E:phpEnvwwwduiliecrontabcrontab.php   // 处理队列数据入库

    ------------------------------

    然后创建一个order表 存储数据

    CREATE TABLE `order` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单表ID',
    `uid` varchar(255) NOT NULL COMMENT '下单用户id',
    `good_name` varchar(255) NOT NULL COMMENT '下单商品名称',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

     windows10 创建定时脚本

     每次脚本执行就会把订单数据处理写入数据库

    以上就是整个流程了,喜欢的可以本地创建运行一下。

  • 相关阅读:
    centos 查看硬盘使用情况
    查看centos内存命令
    VS2008编译运行时出现“外部组件发生异常”错误的解决方法
    20170307-1
    20170307
    centos7安装配置git
    Git理解笔记3
    Git理解笔记2
    Git理解笔记1
    php-设计模式
  • 原文地址:https://www.cnblogs.com/leijiangsheng/p/12993489.html
Copyright © 2020-2023  润新知