Redis 發布訂閱
Redis 發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數量的頻道。
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系:
pubsub1
當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個客戶端:
pubsub2
PHP應用
可簡單利用redis的這一功能做一個異步任務處理應用,首先建立一個(任務)訂閱者,接收(任務)發布者發送的任務消息。
//taskWorker.php 任務處理者
ini_set('default_socket_timeout', -1); //避免在默認的配置下,1分鐘后終端了與redis服務器的鏈接
$redis = new Redis();
$redis->connect('192.168.1.12',6379);
$redis->subscribe(['task_queue'], function($redis,$chan,$msg){
switch ($chan) {
case 'task_queue':
$task = unserialize($msg);
if($task['task']=='send_email'){
// send email
}
// do other job
break;
default:
break;
}
});
運行該腳本:
php taskWorker.php
生產環境中可利用supervisor后臺運行該腳本,處理任務消息??梢园堰@個腳本當作一個任務處理機器,接收各種任務指示并處理。
//taskPub.php 任務發布者
$redis = new Redis();
$redis->connect('192.168.1.12');
$task = [
'task'=>'send_email',
'data'=>'你好,隔壁老王',
];
$redis->publish('task_queue', serialize($task));
該腳本可以封裝成一個易用的類,融入與你的業務代碼中進行任務添加。