(网络学习)1、消息队列总结

in 网站建设
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

应用场景

https://www.imooc.com/video/15163

冗余:延迟处理、保障完成
解耦:出入解耦
流量消峰:redis缓存
异步通信:异步场景
方便扩展:解耦的结果
排序保证:顺序处理

1、mysql加锁队列

-- 订单系统【生产方】 --
接收订单,核心代码:

    //把订单信息保存到订单表中
    $db = DB::getIntance();
    $res = $db->insert("order_queue", $insert_data);

-- 配送系统【消费方】 --
定时发货,核心代码:

    //1. 中间态:锁定处理中数据
    $waiting = ['status'=>0];
    $lock = ['status'=>1];
    $lock_res = $db->update('order_queue',$lock,$waiting,2); //每次刷新新处理2条

    if ($lock_res){
        //2. 对这些处理中数据进行配货
        $res = $db->selectAll('order_queue',$lock);
        //配货代码...

        //3. 修改订单状态为已完成
        $success = [
            'update_time' => date('Y-m-d H:i:s'),
            'status'=>2
        ];
        $res_last = $db->update("order_queue", $success,$lock);
        if($res_last){
            echo 'Success: '.$res_last;
        }else{
            echo 'Failed';
        }
    }

2、redis秒杀队列

秒杀场景下的流量消峰:
【生产方】

    if ($redis->lLen($redis_name) < $num) {
        $redis->rPush($redis_name, $uid . '%' . microtime());
        echo '秒杀成功' . $uid;
    } else {
        echo '秒杀已结束.';
    }

【消费方】

    sleep(2);
    $user = $redis->lPop($redis_name);
    if(!$user || $user=='nil'){ //为空判断
        continue;
    }else{
        $user_arr = explode('%', $user);
        $insert_data = [
            'uid' => $user_arr[0],
            'rtime' => date('Y-m-d H:i:s'),
            'req_time' => $user_arr[1]
        ];
        echo '-';
        $res = $db->insert('redis_queue',$insert_data); //数据库写入成功判断
        if(!$res){
            $redis->rPush($redis_name, $user);
        }
    }

3、rabbitmq应用解耦

可用于解耦、方便扩展
php-amqplib/php-amqplib: demo//publish.php、consumer.php
用法直接参考demo:

$exchange = 'router';
$queue = 'msgs';

$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();

$channel->queue_declare($queue, false, true, false, false);

$channel->exchange_declare($exchange, AMQPExchangeType::DIRECT, false, true, false);

$channel->queue_bind($queue, $exchange);

$messageBody = implode(' ', array_slice($argv, 1));
$message = new AMQPMessage($messageBody, array('content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));
$channel->basic_publish($message, $exchange);

$channel->close();
$connection->close();
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看