redis佇列實現

2022-03-22 23:48:14 字數 1797 閱讀 3752

redis佇列,使用了list列表資料結構,lpush生成,rpop消費模式。

yiic queue worker --qname=

是佇列的名稱,例如:current, position等等, 這只是消費者,即佇列處理程式。

這是乙個典行的yii的命令列程式,檔案在/path/to/protected/commands/queuecommand.php.

呼叫的是actionworker方法, yii中的命令列程式也可以看做一種mvc 上面的命令就是控制器操作。

actionworker方法大致的工作流程如下:

取出所有可用的佇列名稱(列表)

將命令列給定的佇列名稱在列表中對比,如果存在,是繼續,否則退出。

隨機給定乙個超時時間,防止卡死(5-20分鐘)

迴圈讀取指定的佇列中的內容,進行處理

佇列核心基礎**,在/path/to/protected/models/queue.php中,具體做了如下封裝

putin方法的引數 $params為寫入佇列的內容,它是乙個關聯陣列,大致的格式如下:

array(

'method

'=>'

function_name

', //

指定乙個方法名

//(其實這裡指定的方法,已經固定到了queueprocess.php中的方法,

//在消費時固定了,當然也可以不固定,可以改造。

'params

'=>array( //

傳給這個方法的引數,目前是將這個params陣列做為乙個引數傳給到了上面指定的方法中。

'name

'=>'

name''

pass

'=>'

pass')

)

$type引數是佇列的名字, (實際在redis中的真實key會在前面加上queue_ 例如:task,則真實的redis中的key是queue_task),底層真實寫入redis中的資料是將上面的$params進行json_encode後的字串存入redis中。

先看乙個入佇列的程式

$task=array(

'method

'=>'

driver_current_pos',

'params

'=>array(

'lng

'=>1.0

'lat

'=>1.0

'driver_id

'=>'

bj0001')

);queue::model()->putin($task,'

current

');

再看乙個,具體消費處理時的**,此**在/path/to/protected/commands/queuecommand.php中的queue_run方法

private

function queue_run($task) ($params); 這樣可能更直觀

之前,只能向下面這樣寫

call_user_func_array(array(

$queue_process,

$method

), array(

$params

)); }

catch

(exception $e)

}

那麼相對應的佇列業務處理的**,基本上就都在queueprocess這個類中了,他的位置在/path/to/protected/models/queueprocess.php.

redis實現訊息佇列

用redis實現乙個訊息通知系統,總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。記憶體 比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所以如果只...

redis實現訊息佇列

模擬生產者 消費者 生產者 往list資料型別中放入key為product的資料 public static void main string args 消費者 使用堵塞命令實時獲取product的資料 public static void main string args catch except...

redis 實現訊息佇列

redis 實現訊息佇列 測試 component public class timetask object obj null for int i 0 i 10 i 封裝redis工具類 slf4j component public class redisutil catch exception e...