thinkphp6+redis之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的心跳时间,超时时间,包括你选择的数据库,都会失效,所以这里,一定要重新把所有的资源再重新配置一遍,而不能只是简单链接
————————————————
版权声明:本文为CSDN博主「Vencenty」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43889618/article/details/105119225

posted @ 2023-06-08 10:17  窦戈  阅读(570)  评论(0编辑  收藏  举报