ScarShow

< IS >

用 Redis 簡單粗暴實作 MQ

2019-05-29  /  IT  /  MQ PHP Redis

話先說在前頭 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);

Reference