redis - php阻塞式串連有沒有效能的問題

來源:互聯網
上載者:User
我準備用redis的list做一個隊列系統,基本思路是:

1.把資訊用LPUSH操作加到redis中某個list的頭部
2.寫個cron定時執行php讀取這個list。使用redis的RPOP操作從list尾部取走資訊

此外,redis有個BRPOP的操作,當list裡沒有未處理資訊時,會把指令碼阻塞住,有新的資訊時才會繼續執行。

請問php怎麼利用這個特性,要注意什麼,另外這種長時間的串連對效能有沒有什麼影響?
ps.這樣的隊列系統設計合理嗎?

回複內容:

我準備用redis的list做一個隊列系統,基本思路是:

1.把資訊用LPUSH操作加到redis中某個list的頭部
2.寫個cron定時執行php讀取這個list。使用redis的RPOP操作從list尾部取走資訊

此外,redis有個BRPOP的操作,當list裡沒有未處理資訊時,會把指令碼阻塞住,有新的資訊時才會繼續執行。

請問php怎麼利用這個特性,要注意什麼,另外這種長時間的串連對效能有沒有什麼影響?
ps.這樣的隊列系統設計合理嗎?

首先你在shell下執行php,完全沒有最長實行時間這一說,你完全可以把一個php指令碼作為進程不停的監聽。

但是,你用LIST做隊列系統完全沒必要,一個是BRPOP的block是有最長時間限制的,你不能一直hold在那裡。而更好的選擇是利用redis的PUB/SUB機制來做

下面是一個簡單監聽進程,它監聽了channel-1,你在shell下執行它不要關掉

subscribe(array('channel-1'), function ($redis, $chan, $msg) {    // do something    echo $msg;});

然後在其它的程式裡向channel-1發送你需要發送的訊息

publish('channel-1', 'hello, world!');
更新LIST方法

如果你需要用LIST來操作,完全可以不要用BRPOP,直接在迴圈中RPOP就行

rPop('list-1');    if (false !== $msg) {        // 這裡處理訊息    }    // 這裡可以sleep    sleep(60);}

BRPOPLPUSH source destination timeout

BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,當給定列表 source 不為空白時, BRPOPLPUSH 的表現和 RPOPLPUSH 一樣。

當列表 source 為空白時, BRPOPLPUSH 命令將阻塞串連,直到等待逾時,或有另一個用戶端對 source 執行 LPUSH 或 RPUSH 命令為止。

逾時參數 timeout 接受一個以秒為單位的數字作為值。逾時參數設為 0 表示阻塞時間可以無限期延長(block indefinitely) 。

完全能夠用LIST構建一個隊列,用BRPOPLPUSH不會有逾時問題

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.