为了账号安全,请及时绑定邮箱和手机立即绑定

PHP消息队列实现及应用

Wicon PHP开发工程师
难度中级
时长 1小时14分
学习人数
综合评分9.73
65人评价 查看评价
9.8 内容实用
9.8 简洁易懂
9.6 逻辑清晰
  • user.php 客户端
    
    <?php
    //连接本地的 Redis 服务
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    
    if ($redis) {
        echo "success";
    }
    $redis_name='miaosha';
    
    for ($i=0; $i<100; $i++) {
        $uid = rand(100000, 9999999);
    
    //接受用户id
       // $uid = $_GET['uid'];
    //获取一下redis里面已有的数量
        $num = 10;
    //如果当前人数少于时候的时候,则加入这个队列
        if ($redis->lLen($redis_name) < 10) {
            $redis->rPush($redis_name,$uid.'%'.microtime());
            echo $uid . '秒杀成功!'.'<br>';
        } else {
            //如果当天人数已经达到了十个人,则返回秒杀已完成
            echo "秒杀已结束";
        }
    
    }
    $redis->close();
    
    ?>
    查看全部
  • 服务端
    <?php
    include './db.php';
    //连接本地的 Redis 服务
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis_name="miaosha";
    $db=DB::getIntance();
    
    //死循环,
    while (1){
    //第一步
    //从队列最左侧取出一个值来,
    $user = $redis->lPop($redis_name);
    //然后判断这个值是否存在,
    if(!$user||$user=='nil'){
        sleep(2);
        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);
      }
      sleep(2);
    //第二部
    //redis如果把值取出来这个值就不在队列里了
    //如果出现问题了我的业务没有完成失败的情况下,我们需要有一个备份机制把值重新插回队列里
    //数据库插入失败时候的回滚机制
    //释放一下redis
    
    }
    $redis->close();
    ?>


    查看全部
  • 22222
    查看全部
    0 采集 收起 来源:总结.mp4

    2019-10-23

  • 棒   继续加油


    查看全部
  • LTRIM:保留置顶区间内的元素

    LLEN:获取列表长度

    LSET:通过索引设置列表元素值

    LINDEX:通过索引获取列表中的元素

    LRANGE:获取列表置顶范围内的元素

    查看全部
    0 采集 收起 来源:Redis

    2019-06-01

  • LPUSH/LPUSHX:将值插入到(/存在的)列表头部->带X为存在的

    RPUSH/RPUSHX:将值插入到(/存在的)列表尾部->带X为存在的

    LPOP:移出并获取列表的第一个元素

    RPOP:移出并获取列表的最后一个元素

    查看全部
    0 采集 收起 来源:Redis

    2019-06-01

  • 查看文件安装路径方法:

    1、dpkg -L softwarename; 

    2、sudo apt-get install apt-file,

    然后使用命令:apt-file list softwarename, 


    查看全部
    0 采集 收起 来源:总结.mp4

    2019-05-17

  • Redis List类型

    查看全部
    0 采集 收起 来源:Redis

    2019-05-17

  • 消息队列的应用场景

    冗余:记录订单处理程序  

    解耦:分离两套系统,入队出队系统各不影响

    流量削峰:抢购秒杀

    异步通信:入队

    扩展性:订单队列可扩展,新接口处理。

    排序保证:顺序排位

    队列介质:Mysql,Redis(单个包太大,效率低),消息系统


    查看全部
    0 采集 收起 来源:Redis

    2019-05-17

  • <?php

    // 数据库连接类

    class DB{

      //私有的属性

      private static $dbcon=false;

      private $host;

      private $port;

      private $user;

      private $pass;

      private $db;

      private $charset;

      private $link;

      //私有的构造方法

      private function __construct(){

        $this->host =  'localhost';

        $this->port =  '3306';

        $this->user =  'root';

        $this->pass =  'root';

        $this->db =  'imooc';

        $this->charset= 'utf8';

        //连接数据库

        $this->db_connect();

        //选择数据库

        $this->db_usedb();

        //设置字符集

        $this->db_charset();

       }

       //连接数据库

       private function db_connect(){

        $this->link=mysqli_connect($this->host.':'.$this->port,$this->user,$this->pass);

        if(!$this->link){

          echo "数据库连接失败<br>";

          echo "错误编码".mysqli_errno($this->link)."<br>";

          echo "错误信息".mysqli_error($this->link)."<br>";

          exit;

        }

       }

       //设置字符集

        private function db_charset(){

         mysqli_query($this->link,"set names {$this->charset}");

        }

        //选择数据库

       private function db_usedb(){

         mysqli_query($this->link,"use {$this->db}");

       }

       //私有的克隆

       private function __clone(){

         die('clone is not allowed');

       }

       //公用的静态方法

       public static function getIntance(){

         if(self::$dbcon==false){

          self::$dbcon=new self;

         }

         return self::$dbcon;

       }

       //执行sql语句的方法

        public function query($sql){

         $res=mysqli_query($this->link,$sql);

         if(!$res){

          echo "sql语句执行失败<br>";

          echo "错误编码是".mysqli_errno($this->link)."<br>";

          echo "错误信息是".mysqli_error($this->link)."<br>";

         }

         return $res;

       }

        //获得最后一条记录id

        public function getInsertid(){

         return mysqli_insert_id($this->link);

        }

       /**

        * 查询某个字段

        * @param

        * @return string or int

        */

        public function getOne($sql){

         $query=$this->query($sql);

          return mysqli_free_result($query);

        }

        //获取一行记录,return array 一维数组

        public function getRow($sql,$type="assoc"){

         $query=$this->query($sql);

         if(!in_array($type,array("assoc",'array',"row"))){

           die("mysqli_query error");

         }

         $funcname="mysqli_fetch_".$type;

         return $funcname($query);

        }

        //获取一条记录,前置条件通过资源获取一条记录

        public function getFormSource($query,$type="assoc"){

        if(!in_array($type,array("assoc","array","row")))

        {

          die("mysqli_query error");

        }

        $funcname="mysqli_fetch_".$type;

        return $funcname($query);

        }

        //获取多条数据,二维数组

        public function getAll($sql){

         $query=$this->query($sql);

         $list=array();

         while ($r=$this->getFormSource($query)) {

          $list[]=$r;

         }

         return $list;

        }


        public function selectAll($table,$where,$fields='*',$order='',$skip=0,$limit=1000)

        {

                  if(is_array($where)){

                        foreach ($where as $key => $val) {

                            if (is_numeric($val)) {

                                $condition = $key.'='.$val;

                            }else{

                                $condition = $key.'=\"'.$val.'\"';

                            }

                        }

                  } else {

                    $condition = $where;

                  }

                  if (!empty($order)) {

                      $order = " order by ".$order;

                  }

                  $sql = "select $fields from $table where $condition $order limit $skip,$limit";

                  $query = $this->query($sql);

                  $list = array();

                  while ($r= $this->getFormSource($query)) {

                      $list[] = $r;

                  }

                  return $list;

        }

         /**

         * 定义添加数据的方法

         * @param string $table 表名

         * @param string orarray $data [数据]

         * @return int 最新添加的id

         */

         public function insert($table,$data){

         //遍历数组,得到每一个字段和字段的值

         $key_str='';

         $v_str='';

         foreach($data as $key=>$v){

         //  if(empty($v)){

         //   die("error");

         // }

            //$key的值是每一个字段s一个字段所对应的值

            $key_str.=$key.',';

            $v_str.="'$v',";

         }

         $key_str=trim($key_str,',');

         $v_str=trim($v_str,',');

         //判断数据是否为空

         $sql="insert into $table ($key_str) values ($v_str)";

         $this->query($sql);

        //返回上一次增加操做产生ID值

         return $this->getInsertid();

       }

       /*

        * 删除一条数据方法

        * @param1 $table, $where=array('id'=>'1') 表名 条件

        * @return 受影响的行数

        */

        public function deleteOne($table, $where){

          if(is_array($where)){

            foreach ($where as $key => $val) {

              $condition = $key.'='.$val;

            }

          } else {

            $condition = $where;

          }

          $sql = "delete from $table where $condition";

          $this->query($sql);

          //返回受影响的行数

          return mysqli_affected_rows($this->link);

        }

        /*

        * 删除多条数据方法

        * @param1 $table, $where 表名 条件

        * @return 受影响的行数

        */

        public function deleteAll($table, $where){

          if(is_array($where)){

            foreach ($where as $key => $val) {

              if(is_array($val)){

                $condition = $key.' in ('.implode(',', $val) .')';

              } else {

                $condition = $key. '=' .$val;

              }

            }

          } else {

            $condition = $where;

          }

          $sql = "delete from $table where $condition";

          $this->query($sql);

          //返回受影响的行数

          return mysqli_affected_rows($this->link);

        }

       /**

        * [修改操作description]

        * @param [type] $table [表名]

        * @param [type] $data [数据]

        * @param [type] $where [条件]

        * @return [type]

        */

       public function update($table,$data,$where,$limit=0){

         //遍历数组,得到每一个字段和字段的值

         $str='';

        foreach($data as $key=>$v){

         $str.="$key='$v',";

        }

        $str=rtrim($str,',');

          if(is_array($where)){

            foreach ($where as $key => $val) {

              if(is_array($val)){

                $condition = $key.' in ('.implode(',', $val) .')';

              } else {

                $condition = $key. '=' .$val;

              }

            }

          } else {

            $condition = $where;

          }


            if (!empty($limit)) {

                $limit = " limit ".$limit;

            }else{

                $limit='';

            }

        //修改SQL语句

        $sql="update $table set $str where $condition $limit";

        $this->query($sql);

        //返回受影响的行数

        return mysqli_affected_rows($this->link);

       }

    }

    ?>

    使用方法

    对DB类中__construct()中的配置信息,进行符合自己数据库的修改

    include 引入DB类

    使用DB类中的方法需要先进行实例化,以插入数据为例:

    $db = DB::getIntance();

    $insert_data = ['order_id'=>'10010','order_amount' = '200.00','status'=> 1];

    $res = $db->insert('order_info',$insert_data);



    查看全部
  • 左侧插入 lpush


    查看全部
    0 采集 收起 来源:Redis

    2019-04-04

  • redis新手学习:949359454,不懂的可以在群里提问哦https://img1.sycdn.imooc.com//5c7149d100012bbc02260290.jpg

    查看全部
  • redis新手学习交流群:949359454,不懂的可以在群里提问哦https://img1.sycdn.imooc.com//5c7149d100012bbc02260290.jpg

    查看全部
  • redis新手学习交流群:949359454,不懂的可以在群里提问哦https://img1.sycdn.imooc.com//5c7149d100012bbc02260290.jpg

    查看全部
  • redis消息队列的应用场景

    查看全部
    0 采集 收起 来源:消息队列.mp4

    2019-02-22

  • PHP插件

    查看全部
    0 采集 收起 来源:RabbitMQ

    2019-01-31

举报

0/150
提交
取消
课程须知
1.掌握PHP基础知识 2.使用过Redis技术做缓存 3.有简单的Linux命令基础,如cd、sudo、apt、Vim
老师告诉你能学到什么?
1.队列是个什么东西,他能干什么 2.队列的应用场景有哪些 3.如何使用队列对业务进行解耦 4.如何使用Redis队列来消除高压力 5.专业的队列系统RabbitMQ如何来使用 课程所需库文件:http://pan.baidu.com/s/1bQg038

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!