复述,实现队列原理的实例详解

  

<强>复述,实现队列原理的实例详解

  

<>强场景说明:

  

·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时

  

·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台在去处理这些请求

  

·抢购场景,先入先出的模式

  

命令:         rpush + blpop或lpush + brpop      

rpush:往列表右侧推入数据
  

  

blpop:客户端阻塞直到队列有值输出

  

简单队列:

        simple.php=$美元支撑pdo→准备(“选择id、cid的名字从zc_goods限制200000);美元支撑→执行();而(行=美元支撑→获取(pdo:: FETCH_ASSOC)){复述→美元rPush(商品:任务,json_encode(行)美元);}$复述→关闭();      

获取20000年万个商品,并把json化后的数据推入商品:任务队列

        queueBlpop.php//出队   而(真){//阻塞设置超时时间为3秒   $=$复述任务→blPop(数组(“商品:任务”),3);   如果美元(任务){   复述→美元rPush(商品:成功:任务,任务[1]);   $任务=json_decode(任务[1],美元真实);   echo $任务(“id”)。“:”。美元的任务(“cid”)。“:”。“处理成功”;   回声PHP_EOL;   其他}{   回声“没有”。PHP_EOL;睡眠(5);   }   }      之前      

设置blpop阻塞时间为3秒,当有数据出队时保存到商品:成功:任务表示执行成功,当队列没有数据时,程序睡眠10秒重新检查货物:任务是否有数据出队

  

cli模式执行命令:

        php的简单。了现成queueBlpop.php      

优先级队列

  

思路:   

blpop有多个键时,blpop会从左至右遍历键,一旦一个键能弹出元素,客户端立即返回。例如:

        blpop key1 key2 key3 key4      

从key1到key4遍历,如果哪有个键值,则弹出这个值,若多个关键同时有值时,优先弹出排在左边的关键。

        priority.php//设置优先级队列   高美元=吧唐?高:任务”;   中期美元=吧唐?中期:任务”;   低美元=吧唐?低:任务”;=$美元支撑pdo→准备(“选择id、cid的名字从zc_goods限制200000);   美元支撑→执行();   而(行=美元支撑→获取(PDO:: FETCH_ASSOC)) {//cid小放于100年在低级队列   如果($行[cid的]& lt;100){   复述→美元rPush(低,美元json_encode(行)美元);//cid 100到600之间放在中级队列   }elseif($行(cid的)比;100年,,行美元[cid的]& lt;600){   复述→美元rPush(中期美元,json_encode(行)美元);   }//cid大放于600年在高级队列其他{复述→美元rPush(美元高,json_encode(行)美元);}   }$复述→close ();      priorityBlop.php//优先级队列   高美元=吧唐?高:任务”;   美元=吧唐?中期:任务”;中期美元低=吧唐?低:任务”;//出队   而(真){//优先级高的队列放在左侧   $=$复述任务→blPop(数组(高,中,美元低美元),3);   如果美元(任务){   $任务=json_decode(任务[1],美元真实);   echo $任务(“id”)。“:”。美元的任务(“cid”)。“:”。“处理成功”;   回声PHP_EOL;   其他}{   回声“没有”。PHP_EOL;睡眠(5);   }   }      之前      

优先级高的队列放在blpop命令左侧,依次排序,blpop命令会依次弹出高、中、低队列的值

  

cli模式执行命令:

        php的优先级。了现成priorityBlpop.php      

<强>延迟队列

  

思路:   

可以用一个有序集合来保存延迟任务,成员保存任务内容,得分保存(当前时间+延时时间)。用时间作为得分。程序只要用有序集合的第一条任务的得分和当前时间做比较,如果当前时间比小,说明有序集合的所有任务还没到执行时间。

        delay.php=$美元支撑pdo→准备(“选择id、cid的名字从zc_goods限制200000);美元支撑→执行();而(行=美元支撑→获取(pdo:: FETCH_ASSOC)){复述→美元zAdd(商品:延迟:任务,时间()+兰德(300),json_encode(行)美元);}      之前      

将20万条任务导入有序集合商品:延迟:任务,所有任务延迟到之后的1秒到300秒内执行

  

delayHandle.php   

,(真正的){//因为是有序集合,只要判断第一条记录的延时时间,例如第一条未到执行时间,,,//相对说明集合的其他任务未到执行时间,,

复述,实现队列原理的实例详解