brPop和blPop,让Redis帮你阻塞进程

3 篇文章 0 订阅

brpop两个参数,第一个要出队的Key,第二个是Timeout 阻塞延时,如果填写0,那么默认是永久阻塞,当List有值的时候,会立刻pop出来
brpop意思 block right pop 阻塞式右侧出队
blpop意思 block left pop 阻塞式左侧出队
说完了,上代码

  • 代码一
$redis = new Redis();
$redis->connect('127.0.0.1');
$queue = 'queue';

while(true) {
    $r = $redis->rpop($queue);
    var_dump($r);
}
  • 代码二
$redis = new Redis();
$redis->connect('127.0.0.1');
$queue = 'queue';

while(true) {
    $r = $redis->brPop($queue, 0);
    var_dump($r);
}

代码一就是普通死循环,阻塞进程,有数据就pop出来,但是因为一直循环,很浪费性能。
代码二调用函数让Redis帮你阻塞进程,当有数据出现插入List的时候,会pop出来,然后继续等待。

  • 延伸
    php链接Redis的时候会有超时时间的,超时以后要重新进行链接,这种长时间需要后台运行的进程一定要注意处理好异常,所以下面的代码仅供参考
while (true) {
    try {
        $element = $redis->brPop($queue, 0);

    } catch (RedisException $redisException) {
        // 断开连接的话要重新进行连接
        if (!$redis->isConnected()) {
            $redis->connect('127.0.0.1');
        }
    } catch (Exception $exception) {
        // TODO 写入日志或者怎么样的
    }
}

那么我们可以做什么东西呢,可以做类似Laravel的这个异步队列,我只需要写一个接口往特定的队列里灌任务就行了,然后继续补充后面的任务就OK了

------分割线2021-2-23号补充-----------------

断开连接以后的Redis会释放所有资源,比如配置的redis的心跳时间,超时时间,包括你选择的数据库,都会失效,所以这里,一定要重新把所有的资源再重新配置一遍,而不能只是简单链接

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值