easyswoole - 基于swoole扩展实现的一款高性能php框架

EasySwoole 基于Redis組件實(shí)現(xiàn)延遲隊(duì)列

介紹

在用戶要支付訂單的時(shí)候,如果超過30分鐘未支付,會把訂單關(guān)掉。當(dāng)然我們可以做一個(gè)定時(shí)任務(wù),每個(gè)一段時(shí)間來掃描未支付的訂單,如果該訂單超過支付時(shí)間就關(guān)閉,但是在數(shù)據(jù)量小的時(shí)候并沒有什么大的問題,但是數(shù)據(jù)量一大輪訓(xùn)數(shù)據(jù)庫的方式就會變得特別耗資源。當(dāng)面對千萬級、上億級數(shù)據(jù)量時(shí),本身寫入的IO就比較高,導(dǎo)致長時(shí)間查詢或者根本就查不出來,更別說分庫分表以后了。

使用延遲隊(duì)列解決的痛點(diǎn)無非是

  1. 實(shí)現(xiàn)了數(shù)據(jù)延遲
  2. 數(shù)據(jù)攤開(仔細(xì)去理解)

知識點(diǎn)

  1. redis有序集合
  2. EasySwoole Redis協(xié)程客戶端

案例

生成訂單id ---> 扔到延遲隊(duì)列 ---> 延遲隊(duì)列消費(fèi)進(jìn)程不停獲取30分鐘前的訂單滿足條件的訂單 ---> 處理訂單

直接上代碼

EasySwooleEvent.php 注冊redis連接池、注冊延遲隊(duì)列消費(fèi)進(jìn)程

<?php
namespace EasySwoole\EasySwoole;

use App\Process\Consumer;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use EasySwoole\Pool\Manager;
use EasySwoole\Redis\Config\RedisConfig;
use App\RedisPool\RedisPool;
use EasySwoole\Pool\Config;
class EasySwooleEvent implements Event
{

    public static function initialize()
    {
        // TODO: Implement initialize() method.
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {

        //TODO:: 注冊redis連接池
        $config = new Config();
        $redisConfig1 = new RedisConfig([
            'host'      => '127.0.0.1',
            'port'      => '6379'
        ]);

        // 這里的redis連接池看文檔配吧
        Manager::getInstance()->register(new RedisPool($config,$redisConfig1),'redis');

        //TODO:: 延遲隊(duì)列消費(fèi)進(jìn)程
        $processConfig= new \EasySwoole\Component\Process\Config();
        $processConfig->setProcessName('testProcess');

        \EasySwoole\Component\Process\Manager::getInstance()->addProcess(new Consumer($processConfig));
    }

    public static function onRequest(Request $request, Response $response): bool
    {
        // TODO: Implement onRequest() method.

        return true;
    }

    public static function afterRequest(Request $request, Response $response): void
    {
        // TODO: Implement afterAction() method.
    }
}

扔到延遲隊(duì)列

<?php
namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\Pool\Manager;

class Index extends Controller
{

    function index()
    {
        /** @var $redis \EasySwoole\Redis\Redis*/
        $orderId = date('YmdHis', time());
        $redis = Manager::getInstance()->get('redis')->getObj();
        $res = $redis->zAdd('delay_queue_test1', time(), $orderId);
        if ($res) {
            $this->writeJson(200, '訂單添加成功:'.$orderId);
        }
    }

}

延遲隊(duì)列消費(fèi)進(jìn)程

<?php
namespace App\Process;

use EasySwoole\Component\Process\AbstractProcess;
use EasySwoole\Pool\Manager;
use Swoole\Coroutine;

class Consumer extends AbstractProcess {
    protected function run($arg)
    {
        go(function (){
            while (true) {

                //TODO:: 拿到redis
                /** @var $redis \EasySwoole\Redis\Redis*/
                $redis = Manager::getInstance()->get('redis')->defer();

                //TODO:: 從有序集合中拿到三秒(模擬30分鐘)以前的訂單
                $orderIds = $redis->zRangeByScore('delay_queue_test1', 0, time()-3, ['withscores' => TRUE]);

                if (empty($orderIds)) {
                    Coroutine::sleep(1);
                    continue;
                }

                //TODO::拿出后立馬刪除
                $redis->zRem('delay_queue_test1', ...$orderIds);

                foreach ($orderIds as $orderId)
                {
                    var_dump($orderId);

                    //TODO::判斷此訂單30分鐘后,是否仍未完成,做相應(yīng)處理
                }
            }
        });
    }

}

測試

請求index/index 投遞訂單到延遲隊(duì)列

?  ~ curl 127.0.0.1:9501/index/index
{"code":200,"result":"訂單添加成功:20200422004046","msg":null}%

等3s看終端是否輸出

?  php easyswoole.php start
  ______                          _____                              _
 |  ____|                        / ____|                            | |
 | |__      __ _   ___   _   _  | (___   __      __   ___     ___   | |   ___
 |  __|    / _` | / __| | | | |  \___ \  \ \ /\ / /  / _ \   / _ \  | |  / _ \
 | |____  | (_| | \__ \ | |_| |  ____) |  \ V  V /  | (_) | | (_) | | | |  __/
 |______|  \__,_| |___/  \__, | |_____/    \_/\_/    \___/   \___/  |_|  \___|
                          __/ |
                         |___/
main server                   SWOOLE_WEB
listen address                0.0.0.0
listen port                   9501
ip@en0                        192.168.43.57
worker_num                    8
reload_async                  true
max_wait_time                 3
pid_file                      /Users/xx/sites/easyswoole/Temp/pid.pid
log_file                      /Users/xx/sites/easyswoole/Log/swoole.log
user                          xx
daemonize                     false
swoole version                4.4.15
php version                   7.2.18
easy swoole                   3.3.7
develop/produce               develop
temp dir                      /Users/xx/sites/easyswoole/Temp
log dir                       /Users/xx/sites/easyswoole/Log

string(14) "20200422004046"

總結(jié)

這只是一個(gè)思路,大家可以根據(jù)實(shí)際業(yè)務(wù)做不同調(diào)整

主站蜘蛛池模板: 金亨木业建筑模板_清水模板_覆膜板_金亨木业建筑模板厂家批发 | 上海礼品公司_定制商务礼品_促销礼品_福利礼品_创意礼品_上海普田商贸有限公司 | 人防信号控制箱厂家-液位控制器价格-信号灯箱批发厂家-消声加热器-鼎兴自控 | 烟台金海药业有限公司 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 品牌T恤零售/批发厂商/供应商_男女式T恤生产/设计-圣达信T恤 | 全自动清洗过滤器_网式盘式过滤器_石英砂过滤器_叠片过滤器-湖南多灵过滤系统科技有限公司 | 青岛大倾角输送带厂家_橡胶挡边输送带_波纹状挡边输送带_大倾角输送带型号-青岛朗森橡胶有限公司 | 深圳五洲中医院_深圳好的中医院_深圳市医保定点医院[官网] | 矿用三环链|锻打/焊接三环链|矿车万能环|三环链销子-济宁卓力工矿设备有限公司 | 上海叶拓科技有限公司| 廊坊装修装饰公司|家装设计选廊坊纽泽装饰_电话4000621358[本地实体] | 回收求购煤矿机械矿山设备,二手液压支架,刮板输送机-华建智能再生资源公司 | 太原门禁系统_太原车牌识别_山西人脸识别系统-山西元一智能科技有限公司 | 消防栓保温罩,玻璃钢灭火器箱,玻璃钢消防沙箱-潍坊辰阳玻璃钢有限公司 | 油压缓冲器-缓冲器-重庆佑旺机械有限公司[官网]西捷克重庆办事处 | 水处理设备_纯净水设备_软化水设备_反渗透水处理设备「陕西甘肃青海宁夏新疆」认准海川环保 | 阻垢剂|缓蚀剂|杀菌剂|分散剂|水处理剂|印染助剂|水处理药剂|造纸助剂|膜阻垢剂|缓蚀剂|HEDP|ATMP|螯合剂-山东凯瑞化学有限公司 水处理药剂生产厂家 | 葫芦岛装修公司,兴城装修家装公司,葫芦岛鑫昕装饰 | 济宁市泓世新型建材有限公司,山东ALC墙板,GRC轻质隔墙板,预制化粪池,复合墙板加工厂家 | 指挥调度|调度系统|应急指挥调度|应急指挥|可视化调度|多媒体指挥调度|融合通信|综合调度|应急指挥系统|IP调度系统-北京瑞光极远数码科技有限公司 | 注塑机螺杆_光学无卤耐磨耐腐蚀螺杆_合金材料_螺杆研磨抛光机_杰宇螺杆 | 深圳理津技术有限公司(REHLOGY)-全球工业品供应商:自动化产品|仪器仪表|设备|备品备件|工具|消耗品|非标设备|建筑工程等一站式综合服务! | 西安宣传片拍摄,陕西艺景网络科技有限公司资料备份,西安影视公司,视频拍摄制作,抖音视频制作,纪录片拍摄西安短视频摄影团队,西安抖音视频拍摄 | 威海电子电镀,山东五金电镀,威海镀镍,山东镀铜镍铬-威海鑫镱金属制品厂 | 危废处理_危废处置_危废处理公司-江苏绿瑞特环境科技股份有限公司 | 破碎机设备-锤式颚式反击式圆锥移动冲击式破碎机厂家-成都大宏立机器公司 | 锁螺丝机_自动螺丝机_手持式自动锁螺丝机_自动打螺丝机-普思自动化 | 日本国际高中_上海日本国际高中学校排名_日本国际高中留学课程_上海日语国际高中学校学费-上海工程技术大学国际多语种特色高中课程【官网】 | 上海希喆机械有限公司-Schunk雄克,雄克卡盘, 雄克机械手, B+R贝加莱, ELCIS编码器,艾西斯编码器, TWK编码器,Nexen,Joyce dayton升降机,Thomson汤姆森,TPG减速机,INA导轨。 | 上海便携式液体_日本理音液体_HACH液体颗粒计数器,metone尘埃粒子计数器-上海翰森科学仪器有限公司 | 深圳激光焊锡机-全自动点胶机设备-全自动激光焊锡机厂家-深圳创精锐 | 思沃普智能会议预约管理系统-视频会议管理-信息发布-访客管理-会议运维-会议支持-工位管理系统 | 营口新北方制糖有限公司 | 中国工业网_网络工业品牌 资讯创造价值 | 上海网站建设公司|上海自适应网站制作|上海仿制网站建设公司-智淇网络 | 专业的展会信息服务平台 - 展加 专题秀_汇聚网络热门专题_实时报道各类新闻专题资讯 | 欧路哲门窗|佛山欧路哲门窗有限公司|专业门窗定制品牌 | 青州东威机械有限公司,洗沙机,脱水筛、细沙回收机,淘金设备,洗石机,砂石分离机,筛沙机,采沙船,清淤船,破碎制砂机,海沙淡化设备 | 泰安led显示屏-泰安户外裸眼3D显示屏-扩声系统-舞台灯光机械-电子屏-肥城宁阳新泰东平-泰安市奇美特电子有限公司 | 球磨机配件_烘干机配件_回转窑配件_球磨机小齿轮_球磨机大齿轮-巩义市兴农机械制造公司 |