使用Redis的List(列表)实现消息队列,生产者使用lPush命令发布消息,消费者使用rpop命令获取消息并进行处理。
一、生产者(Producer.php)
<?php
/**
* redis-list实现消息队列
* 生产者:发布消息
*/
try{
//声明消息队列的键名
$queue_key = 'test_queue_key';
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//向消息队列中生产10条消息
for ($i=0; $i<10; $i++){
//$redis->lPush返回列表的长度
$res = $redis->lPush($queue_key, json_encode(array('id' => $i, 'value' => 'data')));
var_dump($res);
}
} catch (Exception $e){
echo $e->getMessage();
}
二、消费者(Consumer.php)
<?php
/**
* redis-list实现消息队列
* 消费者: 获取并处理消息
*/
try{
//声明消息队列的键名
$queue_key = 'test_queue_key';
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//死循环一直监听消息队列
while(true) {
//队列先进先出,弹出先加入的消息
$res = $redis->rpop($queue_key);
if ($res === false) {
//如果队列为空,则等待1秒,降低因为死循环服务器的压力
sleep(1);
} else {
//获取一条消息并进行处理
$res_arr = json_decode($res, true);
//模拟处理消息失败或成功
$rand = mt_rand(0, 9);
if($rand < 3) {
//处理失败 ,将消息重新放入队列
$redis->lPush($queue_key, $res);
echo 'failure:' . $res . PHP_EOL;
} else {
//处理成功
echo 'success:' . $res . PHP_EOL;
}
}
}
} catch (Exception $e){
echo $e->getMessage();
}
三、执行结果
1.执行生产者: php Producer.php
2.执行消费者:php Consumer.php