消息队列 秒杀实现 redis 高并发 定时任务

消息队列

概念

​ (流程中间件 ,2个或者多个系统场景有优势)

  • 队列结构的中间件

  • 消息放入后,不需要立即处理

  • 由订阅者/消费者按顺序处理

原理

业务系统(入队)->消息队列->(出队)队列处理系统

场景

  • 数据冗余(持久化存储在队列中 由订单程序进行处理 存储每个记录处理完成)

  • 系统解耦 订单系统和配送系统

    mysql 订单队列
       队列表  id(11) order_id(11),mobile(vch20),created_at(datetime),status(tinyint(2))

    一个文件用于接受用户订单信息并写入队列的一个文件(order.php)

    ​ 1.将用户传过来的数据进行过滤 (防止mysql注入)

    ​ 2.生成的订单信息存入队列表中

    ​ 3.把数据存放到队列表中

    主要是配送系统处理队列中的订单进行标记的文件(goods.php)

    1. 先把要处理的记录更新为等待处理

      $waiting = array('status'=>0)
      $lock =array('status'=>2)
      $res =update('duilie',$lock,$waiting);

    2. 我们要选择出刚刚我们更新的这些数据,进行配送系统的处理

      if($res){
        //选择出处理的订单内容
        $res=$db->selectAll('duilei',$lock);
        //然后由配货系统进行退货处理
        .......
      }

    3. 把这些处理过的程序更新为已完成

      $arr =array(
          'status'=>1,
          'updated_at'=>date('y-m-d h:i:s',time());
      )

      定时脚本(goods.sh)

      crontab -e 命令

      每分钟执行一次

      #m h dom mon dow command

      分 时 日 月 周 执行的命令

      */1 * * * * /home/sites/goods.sh >> /home/log.log 2>&1 把结果输出日志文件中并转换标准输出

      tail -f log.log 监控日志文件

    #!/bin/bash
    date"+%G-%m-%d  %H:%M:S"  
    cd  写goods.sh的目录(/home/sites/)
    php goods.php

     

  • 流量削峰 list类型实现秒杀

     

 

秒杀表  id(int10),uid(int11),time_stamp(vach24)

 

user.php

加载redis组件
    $redis = new Redis();
    $redis->connect('127.0.0.1',6379);
    $redis_name="miaosha";
    
    高压力测试
    for($i=0;$i<100;$i++){
    $uid = rand(100000,999999);
    }
    
​
接收用户uid
    $uid =$_GET['uid'];
获取redis里面已有是数量
    $num =10;
如果当前人数少于10,则加入队列
if($redis->lLen($redis_name) <10)
{
  $redis->rPush($redis_name,$uid.'%'.microtime());
}else
{
达到10人,输出秒杀结束
echo '秒杀结束';
}
$redis->clsoe();
​
​

save.php

死循环
while(1)
{
    //从队列最左侧取出一个值
    $user =$redis->lPop($redis_name);
    //然后判断这个值是否存在
    if(!$user || $user =='nil')
    {
        sleep(2);
        continue;
     
    }
}
切割出时间,uid
$user_arr = explode('%',$user);
$insert_data  = array(
    
)
保存到数据库中
​
数据插入失败时候回滚机制
释放redis
​

 

  • 异步通信

  • 排序保证

  • 扩展性

队列优缺点

队列介质

  • mysql :可靠性高,意实现,速度慢

  • redis:速度快,单条大消息包时效率低

  • 消息系统:专业性强,可靠,学习成本高

消息处理触发机制

  • 死循环方式读取:易实现,故障时无法及时恢复

  • 定死任务:压力均分,有处理量上限

  • 守护进程:类似于php-fpm和php-cg,需要shell基础

 

lpush/lpushx 将值插入到存在的列表头部

RabbitMQ 更专业的消息系统实现方案 (复杂逻辑项目)

你可能感兴趣的:(redis)