PHP利用Redis的List简单实现消息队列

使用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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值