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

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的心跳时间,超时时间,包括你选择的数据库,都会失效,所以这里,一定要重新把所有的资源再重新配置一遍,而不能只是简单链接

你可能感兴趣的:(PHP,Redis)