Redis 完成行列ITeye - AG环亚娱乐

Redis 完成行列ITeye

2019-01-10 21:40:51 | 作者: 山菡 | 标签: 行列,使命,时刻 | 浏览: 2763

场景阐明:

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

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

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

rpush + blpop 或 lpush + brpop

 

rpush : 往列表右侧推入数据 
blpop : 客户端堵塞直到行列有值输出

 

简略行列:
simple.php
$stmt = $pdo- prepare(select id, cid, name from zc_goods limit 200000);$stmt- execute();while ($row = $stmt- fetch(PDO::FETCH_ASSOC)) {    $redis- rPush(goods:task, json_encode($row));} $redis- close();

 

获取20000万个产品,并把json化后的数据推入goods:task行列

queueBlpop.php
// 出队while (true) {    // 堵塞设置超时时刻为3秒    $task = $redis- blPop(array(goods:task), 3);    if ($task) {        $redis- rPush(goods:success:task, $task[1]);        $task = json_decode($task[1], true);        echo $task[id] . : . $task[cid] . : . handle success;        echo PHP_EOL;    } else {        echo nothing . PHP_EOL;        sleep(5);    }}

 

设置blpop堵塞时刻为3秒,当有数据出队时保存到goods:success:task表明履行成功,当行列没有数据时,程序睡觉10秒从头查看goods:task是否有数据出队

cli 形式履行指令:
php simple.phpphp queueBlpop.php

 

优先级行列

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

blpop key1 key2 key3 key4

 

从key1到key4遍历,假如哪个key有值,则弹出这个值,若多个key一起有值时,优先弹出排在左面的key。

priority.php
// 设置优先级行列$high = goods:high:task;
$mid = goods:mid:task;$low = goods:low:task;
 $stmt = $pdo- prepare(select id, cid, name from zc_goods limit 200000);
$stmt- execute();while ($row = $stmt- fetch(PDO::FETCH_ASSOC)) 
{    // cid 小于100放在初级行列    if ($row[cid] 100) 
{        $redis- rPush($low, json_encode($row));    
}    // cid 100到600之间放在中级行列    elseif ($row[cid] 100 $row[cid] 600) 
{        $redis- rPush($mid, json_encode($row));    }   
 // cid 大于600放在高档行列     else {        $redis- rPush($high, json_encode($row));    }
}$redis- close();

 

priorityBlop.php
// 优先级行列$high = goods:high:task;$mid = goods:mid:task;$low = goods:low:task;// 出队while(true){    // 优先级高的行列放在左边    $task = $redis- blPop(array($high, $mid, $low), 3);    if ($task) {        $task = json_decode($task[1], true);        echo $task[id] . : . $task[cid] . : . handle success;        echo PHP_EOL;    } else {        echo nothing . PHP_EOL;        sleep(5);    }}

 

优先级高的行列放在blpop指令左边,顺次排序,blpop指令会顺次弹出high, mid, low行列的值

cli 形式履行指令:
php priority.phpphp priorityBlpop.php

 

可以用一个有序调集来保存推迟使命,member保存使命内容,score保存(当时时刻 + 延时时刻)。用时刻作为score。程序只需用有序调集的第一条使命的score和当时时刻做比较,假如当时时刻比score小,阐明有序调集的一切使命还没到履行时刻。

delay.php
$stmt = $pdo- prepare(select id, cid, name from zc_goods limit 200000);$stmt- execute();while ($row = $stmt- fetch(PDO::FETCH_ASSOC)) {    $redis- zAdd(goods:delay:task, time() + rand(1, 300), json_encode($row));}

 

将20万条使命导入有序调集goods:delay:task,一切使命推迟到之后的1秒到300秒内履行

delayHandle.php

while (true) {// 由于是有序调集,只需判别第一条记载的延时时刻,例如第一条未到履行时刻    // 相对阐明调集的其他使命未到履行时刻   

$rs = $redis- zRange(goods:delay:task, 0, 0, true);

// 调集没有使命,睡觉时刻设置为5秒   

    if (empty($rs)) {        
                echo no tasks , sleep 5 seconds . PHP_EOL;sleep(5);continue;}
     $taskJson = key($rs);   
              $delay = $rs[$taskJson];   
              $task = json_decode($taskJson, true);   
      $now = time();// 到时刻履行延时使命   
     if ($delay = $now) {       

// 对当时使命加锁,防止移动移动延时使命到使命行列时被其他客户端修正       

        if (!($identifier = acquireLock($task[id]))) {         
       continue;}        

// 移动延时使命到使命行列       

$redis- zRem(goods:delay:task, $taskJson);        
$redis- rPush(goods:task, $taskJson);       
echo $task[id] . run . PHP_EOL;        

// 开释锁       

releaseLock($task[id], $identifier);    } 
    else {       

// 延时使命未到履行时刻       

 $sleep = $delay - $now;       

// 最大值设置为2秒,确保假如有新的使命(延时时刻1秒)进入调集时可以及时的被处理

    $sleep = $sleep 2 ? 2 :$sleep;       
    echo wait . $sleep . seconds . PHP_EOL;        sleep($sleep);   
    }
}

 

这个文件对有序调集内的推迟使命做处理,假如推迟使命到了履行时刻,则把推迟使命移动到使命行列中

queueBlpop.php
// 出队while (true) {   
// 堵塞设置超时时刻为3秒   
$task = $redis- blPop(array(goods:task), 3);   
if ($task) {       
$redis- rPush(goods:success:task, $task[1]);       
$task = json_decode($task[1], true);       
echo $task[id] . : . $task[cid] . : . handle success;       
echo PHP_EOL;    } else {       
echo nothing . PHP_EOL;sleep(5);   
    }
}

 

处理使命行列中的使命

cli形式下履行指令:
php delay.phpphp delayHanlde.phpphp queueBlpop.php
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    数组调集增加算法ITeye

    调集,数据,数组
  • 2
  • 3
  • 4

    递归算法(附华为笔试题一个)ITeye

    一般,功用,重复使用
  • 5

    java线程总结ITeye

    线程,状况,运转
  • 6

    C#根本参考资料ITeye

    类型,目标,转化
  • 7

    pymongo根本操作ITeye

    回来,链接,一切
  • 8
  • 9
  • 10

    深入分析各排序算法ITeye

    排序,算法,快排