欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据库_Redis 入门基础到高级

程序员文章站 2022-04-28 13:57:22
一、PHP消息队列实现及应用 二、消息队列的优缺点 三、消息队列的配置和准备工作 案例如下: 下面是队列表字段及属性 四、Mysql订单队列 1、接受订单,并写入数据 order.php 2、队列系统处理队列中的订单并进行标识goods.php 3、定时任务。每分钟执行一次goods.sh 要会sh ......

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

 

数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

 

数据库_Redis 入门基础到高级

 数据库_Redis 入门基础到高级

二、消息队列的优缺点

 数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

 

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

 案例如下:

数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

 

 

 下面是队列表字段及属性

数据库_Redis 入门基础到高级

 

 四、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

数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

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

 数据库_Redis 入门基础到高级

执行命令保存文件:wq

新建日志文件命令

 touch /home/html/ssggw/log.log

 

数据库_Redis 入门基础到高级

监控日志文件

数据库_Redis 入门基础到高级

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

数据库_Redis 入门基础到高级

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

数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

 

 解耦案例结束

五、redis

数据库_Redis 入门基础到高级

 

 数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

数据库_Redis 入门基础到高级

六、redis队列实现秒杀

1、创建数据表 redis_queue

数据库_Redis 入门基础到高级

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();

测试

数据库_Redis 入门基础到高级

 

 访问user.php文件url

数据库_Redis 入门基础到高级

结果

数据库_Redis 入门基础到高级

数据库表情况

数据库_Redis 入门基础到高级