用 Redis 簡單粗暴實作 MQ
話先說在前頭 Redis
是快取伺服器不是 Message Queue
,但有時候現實面不允許時還是必須要妥協。
先用 Redis
將功能實作出來,往後再找適合的 MQ
產品去替換 Redis
。
簡單說明
Redis
是一個分散式且支援持久化的 key-value
快取伺服器,除了單純 Get/Set
操作變數之外還提供許多額外的函數用來操作變數。
運作原理
上面說到了除了單純的 Get/Set
之外,能夠實作 MQ
的關鍵就在於而外提供的函數,主要能夠實作出 MQ
的關鍵在於 Push/Pop
的函數。
這組函數主要是將變數作為 List 處理,可以將它模擬成 Queue
或是 Stack
,現在我們是要將它實作成 MQ
所以我們要模擬成 Queue
。
我們可以使用函數 lPush, brPop
或是 rPush, blPop
實作,要注意的是我們在 Pop
的時候使用 Blocking
模式的函數,可以設定 Connection Timeout
用來減少伺服器壓力。
Sample Code
下面是簡單的程式範例。
Producer
<?php
$redis = (new Redis)->connect('127.0.0.1', 6379);
// Enqueue
$json = json_encode([
'timestamp' => time()
]);
$redis->lPush('mq', $json);
Consumer
<?php
$redis = (new Redis)->connect('127.0.0.1', 6379);
// Dequeue
$bundle = $redis->brPop('mq', 60);
$json = json_decode($bundle[1], true);
var_dump($json);