永发信息网

请教PHP+Redis实现任务队列的思路

答案:1  悬赏:80  手机版
解决时间 2021-11-22 00:59
请教PHP+Redis实现任务队列的思路
最佳答案
// 创建请求ID标志, uniqid 无法保证唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超时策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(后)插入队列

// 堵塞等待队列中第一个和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
if((time()-$time_start)> $time_out) {
break; // 超时跳出(某些原因队列异常了, 可能永远取不到)
}
usleep(10); // sleep 10ms, 再次尝试
}

// 这里执行任务的处理代码....

// $response 已拼装好要返回的内容
// 处理完成后(数据库等已入库更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次确认第一个是本请求
$redis->lPop($tsk_name); // 完成任务了, 从队列中移除
}else{
// 出现这种情况, 是因为超时了, 或前面的$uuid没有被消费
// 若不清除, 后续的请求, 都将无法正常进入队列执行
// 取队列中的所有$uuid
$queues = $redis->lRange($tsk_name, 0, -1);
foreach($queues as $i=>$uid){
if($uid==$uuid){
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
请你给下列词语找最佳搭档
鱼收拾完了,明天早上做,用不用放在冰箱里
龙山旅游公司地址在什么地方,想过去办事,
轰6的最大载弹量为9t,尺寸相对于战斗机很大
桂林哪里有419交友群
QTP VBScript Sub中当出错时会触发场景,调用
潮洲到陆丰的高铁班次
绍兴县镜湖旅游有限公司地址好找么,我有些事
石灰弄到车上怎么办
小孩脚是外八字。把脚弓弓起来了就好了吗?
三星a71oo指纹解锁取消不了怎么办
形容农作物句子
()x11/4=0·9十()=()÷5/7=1·25-()=
So has he 和So he has 的区别
女朋友发个照片给我看我不懂是什么意思
推荐资讯
红河县乐育乡蒙居村至红河石屏县有多少公里
第二题怎么做呢
我外孙女2016年7月出生,起名叫杨嘉怡测试评
东芝中央空调的优势
拉杆行李箱的体积约是六十什么
薛之谦因为什么事情帅爆了?
纱布孔径与无纺布孔径哪个大
58同城发布个人租车信息
我认识了个女朋友,我想要去更好的地方发展,女
橡胶软接头、Y型过滤器需要法兰连接吗
麻辣烫50斤水要放多少盐,鸡精,味精,跪求
时尚男装三个模特怎么搭配
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?