Redis 實現消息隊列 MQ

Redis 2.4版本以後就內置隊列的功能了,若是是平常比較簡單的隊列應用,能夠選擇Redis , 效率還很高的!!php

 

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

1、有序隊列:redis

一、生產者:ui

$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');

二、消費者:spa

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); } }

 

2、無序隊列:code

一、生產者:htm

$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');

二、消費者:blog

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隊列

相關文章
相關標籤/搜索