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