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
作者:douyuanjun
出处:https://www.cnblogs.com/douyuanjun/p/17465441.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具