zoukankan      html  css  js  c++  java
  • 数据库_Redis 入门基础到高级

    一、PHP消息队列实现及应用

     

    二、消息队列的优缺点

     

     三、消息队列的配置和准备工作

     案例如下:

     下面是队列表字段及属性

     四、Mysql订单队列

     1、接受订单,并写入数据 order.php

    <?php
    //这个文件是用来接受用户的订单信息并写入队列的一个文件
    
    //引入数据库链接类
    include '../include/db.php';
    //当接收到用户手机号不为空的时候
    
    if(!empty($_GET['mobile'])){
      //这里首先是订单中心的处理流程
      //因为订单系统是个单独的流程  这里需要处理
      //...... 这里不单独写了
      //把用户提交的数据进行过滤,防止sql注入
       //直接假设个订单号
      $order_id = rand(10000,99999);
       //生成订单信息
        $insert_data = array(
             'order_id'=>$order_id,
             'mobile'=>$_GET['mobile'],
             'created_at'=>date('Y-m-d H:i:s',time()),
             'status'=>0,//0未处理 1已处理2处理中 
        );
        //把订单信息存入到队列表中
        $db = DB::getIntance();//此处是操作数据库,注意不同的框架有相应的内置的操作方法
       $res =  $db->insert('order_queue',$insert_data);//insert($table,$data)
      if($res){
        echo  '插入成功';
    
     }else{
        echo '插入失败';
        
     }
    
    
    }

    2、队列系统处理队列中的订单并进行标识goods.php

    <?php 
    //这个文件主要是配送系统处理队列中的订单并进行标记的一个文件
    //加载数据库操作类
    include '../include/db.php';
    //初始化
    $db = DB::getIntance();
    //1:先把要处理的记录更新为等待处理(此处要锁定订单,防止处理未完成便被取用)
    $waiting = array(‘status’=>0);//等待处理的数据
    $lock = array(‘status’=>2);//锁定的数据
    $res_lock = $db->update('order_queue',$lock,$waiting,2);//update($table,$data,$where,$limit=0)
    //2:选择出刚刚更新的数据,然后进行配送系统的处理
    if($res_lock){
        //选择出要处理的订单的内容 
         $res = $db->selectAll('order_queue',$lock);//
        //然后由配货系统进行配货处理
        //......//此处是配货系统 
       //3:把处理过的程序更新为已完成
       $success = array(
            'status'=>1,//已完成
            'updated_at'=>date('Y-m-d H:i:s',time()),
        );
        $res_last = $db->update('order_queue',$success,$lock);
        if($res_last){
             echo 'Success'.$res_last;
        }else{
             echo 'Fail'.$res_last;
        }
    
    }else{
        echo 'ALL Finished';
    }

    3、定时任务。每分钟执行一次goods.sh  要会shell基础

    #!/bin/bash
    
    date "+%G-%m-%d %H:%M:S"
    cd /home/html/ssggw/queue_mysql/
    php goods.php

    4、在服务器部署下定时任务crontab -e

    为了方便看结果,把定时任务结果输出到日志文件中,设定为标准输出,命令如下

     

    执行命令保存文件:wq

    新建日志文件命令

     touch /home/html/ssggw/log.log

    监控日志文件

    数据库中已经成功两条数据

     数据库中已经成功四条数据

     解耦案例结束

    五、Redis

     

    六、Redis队列实现秒杀

    1、创建数据表 redis_queue

    2、接受用户请求的程序user.php

    <?php
    //先加载redis组件
    $redis = new Redis();
    $redis->connect('127.0.0.1',6379);
    $redis_name = "miaosha";
    
    //接受用户id
    $uid = $_GET['uid'];
    //获取下redis里面已有的数量
    $num = 10;//秒杀前10个
    //如果当天人数少于10的时候,则加入这个队列
    if($redis->lLen($redis_name)<10){
       $redis->rFush($redis_name,$uid.'%'.microtime());//将用户uid(连接一个微妙)加入$fredis_name这个队列的尾部
       echo "秒杀成功";
    }else{
      //如果当天人数已经达到了10个人,则返回秒杀已完成 
       echo "秒杀已结束";
    }
    
    //关掉redis链接
    $redis->close();

    3、处理程序,即报数据写入mysql对应数据表savetodb.php

    <?php 
    //引入操作数据库类
    include '../include/db.php';
    
    //加载redis组件
    $redis = new Redis();
    $redis->connect('127.0.0.1',6379);
    $redis_name = "miaosha";
    
    $db = DB::getlntance();
    
    //死循环
    while(1){
       //从队列最左侧取出一个值来
       $user = $redis->IPop($redis_name);
       //然后判断这个值是否存在
       if(!$user || $user =='nil'){
           //减少服务器压力 每1秒执行一次  真正的秒杀时间会很短,不用设置
           sleep(1);
           //跳出循环
           continue;
       }
      //切割出时间,uid
      $user_arr = explode('%',$user);
          //定义一个数组
       $insert_data = array(
            'uid'=>$user_arr[0],
            'time_stamp'=>$user_arr[1],
       );
       //保存到数据库中
        $res = $db->insert('redis_queue',$insert_data);
       //数据库插入失败的时候的回滚机制
       if(!$res){
          $redis->rPush($redis_name,$user);
       }
    }
    //释放一下redis
    $redis->close();

    测试

     访问user.php文件url

    结果

    数据库表情况

  • 相关阅读:
    postman 安装,配置,鉴权
    monkey操作,获取包名,参数,日志,百分比
    monkey环境搭建
    postman接口测试&压力测试
    Fiddler介绍(PC端+Android,IOS端,弱网)
    软件测试的环境搭建
    python2.x- selenium-robot framework自动化测试环境搭建
    SVN的简单操作,版本控制
    svn介绍和安装
    js 函数和函数的参数
  • 原文地址:https://www.cnblogs.com/zmdComeOn/p/10311398.html
Copyright © 2011-2022 走看看