<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Redis 實現隊列http://igeekbar.com/igeekbar/post/436.htm

      場景說明:

      ·用于處理比較耗時的請求,例如批量發送郵件,如果直接在網頁觸發執行發送,程序會出現超時

      ·高并發場景,當某個時刻請求瞬間增加時,可以把請求寫入到隊列,后臺在去處理這些請求

      ·搶購場景,先入先出的模式

      命令:

      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

       

      posted @ 2017-09-21 22:46  igeekbar  閱讀(312)  評論(0)    收藏  舉報

      中文互聯: GBin1.com | RSS訂閱 | 郵件訂閱 | 手機訂閱

      主站蜘蛛池模板: 国产午夜精品视频在线播放| 在线观看热码亚洲AV每日更新| 国产毛片三区二区一区| 亚洲精品一区二区区别| 老熟女重囗味hdxx69| 夜夜高潮次次欢爽av女| 久久久久久久久久久久中文字幕| 九九热精品视频免费在线| 在线人人车操人人看视频| 亚洲悠悠色综合中文字幕| 精品一区二区不卡免费| 免费无码黄动漫在线观看| 色伊人久久综合中文字幕| 永靖县| 国产午夜福利小视频在线| 精品国产成人亚洲午夜福利| 亚洲sm另类一区二区三区| 又爽又大又黄a级毛片在线视频| 亚洲色大成网站WWW永久麻豆| 韩国无码av片在线观看| 欲香欲色天天天综合和网| 国产精品播放一区二区三区| 在线a级毛片无码免费真人 | 日韩精品一区二区午夜成人版| 自拍偷拍第一区二区三区| 亚洲色婷婷综合开心网| 一区二区三区国产不卡| 亚洲成av人在线播放无码| 亚洲黄色性视频| 欧美乱大交aaaa片if| 广汉市| 強壮公弄得我次次高潮A片| 国产99视频精品免费视频36| 在线观看国产区亚洲一区| 亚洲天堂成人一区二区三区| 内射老妇bbwx0c0ck| 国产片av在线观看国语| 中文字幕无线码免费人妻| 成人又黄又爽又色的视频| 92国产精品午夜福利| 人成午夜大片免费视频77777|