Redis 實現消息隊列 MQ


Redis 2.4版本之后就內置隊列的功能了,如果是日常比較簡單的隊列應用,可以選擇Redis , 效率還很高的!!

 

Redis 還能實現 有序 和 無序 兩種隊列(只討論生產者和消費者這種模式的隊列):

一、有序隊列:

1、生產者:

$redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); $redis->zAdd('MQ', 1, 'need to do 1'); $redis->zAdd('MQ', 2, 'need to do 2');

2、消費者:

while (true) { $pid = pcntl_fork(); if ($pid == -1) { //創建子進程失敗,不處理 } else if ($pid == 0) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //執行有序查詢,取出排序前10進行處理 $redis->zRevRangeByScore('MQ', '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,10))); exit; } else { //主進行執行中,等待 pcntl_wait($status); } }

 

二、無序隊列:

1、生產者:

$redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); $redis->LPUSH('MQ', 1, 'need to do 1'); $redis->LPUSH('MQ', 2, 'need to do 2');

2、消費者:

while (true) { $pid = pcntl_fork(); if ($pid == -1) { //創建子進程失敗,不處理 } else if ($pid == 0) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //執行出隊處理,BLPOP是阻塞的出隊方式,其實還可以用LPOP,不過用lPOP就要自行判斷數據是否為空了 $mq = $redis->BLPOP('MQ') //do something } else { //主進行執行中,等待 pcntl_wait($status); } }

 

簡單版就是這樣了~~當然,如果應用規模大,還是建議用正規的MQ,例如:RabbitMQ

 

轉自:http://www.cnblogs.com/chunguang/p/5892740.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM