Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
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));
该脚本可以封装成一个易用的类,融入与你的业务代码中进行任务添加。