<强>复述,实现队列原理的实例详解强>
<>强场景说明:强>
·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时
·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台在去处理这些请求
·抢购场景,先入先出的模式
命令:
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
,(真正的){//因为是有序集合,只要判断第一条记录的延时时间,例如第一条未到执行时间,,,//相对说明集合的其他任务未到执行时间,,
复述,实现队列原理的实例详解