亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

Laravel Redis 多個進程同時取隊列的問題解析

2020-03-22 17:50:46
字體:
來源:轉載
供稿:網友
這篇文章主要給大家介紹了關于 Laravel Redis 多個進程同時取隊列問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友下面來一起學習學習吧。

前言

最近在工作中遇到了一個問題,開啟多個進程處理隊列會重復讀取 Redis 中隊列嗎?是否因此導致重復執行任務?下面就來通過示例代碼詳細介紹下。

使用 Supervisor 監聽 Laravel 隊列任務,其中 Supervisor 的配置如下:

[program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemonautostart=trueautorestart=truenumprocs=8redirect_stderr=truestdout_logfile=/var/www/xxx.cn/worker.log

注意: numprocs = 8,代表開啟 8 個進程來執行 command 中的命令。

如下:

PS C:/Users/tanteng/website/laradock docker-compose exec php-worker sh/etc/supervisor/conf.d # ps -ef | grep php 7 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 8 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 9 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 10 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 11 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 12 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 13 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 14 root 0:00 php /var/www/xxx.cn/artisan queue:work --queue=sendfile --tries=3 --daemon 44 root 0:00 grep php

Laravel 多進程讀取隊列內容是否會重復

在 Laravel 的某個控制器方法,一次放入多個任務隊列:

html' target='_blank'>public function index(Request $request) $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile  $this- dispatch((new SendFile3())- onQueue( sendfile }

在隊列處理的方法打印日志,打印處理的隊列的 ID:

app/Jobs/SendFile3.php

public function handle() info( invoke SendFile3  dump( invoke handle  $rawbody = $this- job- getRawBody(); $info = json_decode($rawbody, true); info( queue id: . $info[ id }

Laravel 使用 Redis 的 list 作為隊列的數據結構,并會為每個隊列分配一個 ID,數據結構如下:

{ job : Illuminate//Queue//CallQueuedHandler@call , data : { commandName : App//Jobs//SendFile3 , command : O:18:/ App//Jobs//SendFile3/ :4:{s:6:/ /u0000*/u0000job/ N;s:10:/ connection/ N;s:5:/ queue/ s:8:/ sendfile/ s:5:/ delay/ N;}  id : hadBcy3IpNsnOofQQdHohsa451OkQs88 , attempts : 1}

請求這個控制器路由(或者命令行方式),就可以看到 Redis 中多了很多隊列任務了,如圖:

這個時候開啟 Supervisor 處理隊列任務,并查看日志:

[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:JaClJzhDEvntzLCRIz6uRQkCVLbE8Y9C[2017-12-23 19:01:01] local.INFO: queue id:ukHv0Li4P2VgPa55qU6yEOJM27Mo5YwJ[2017-12-23 19:01:01] local.INFO: queue id:ObMpwDTmnaveBUkU7aan5abt3Agyt90l[2017-12-23 19:01:01] local.INFO: queue id:fo2qZn2ftSdQtdnKOciMK7iJb4qlhRGE[2017-12-23 19:01:01] local.INFO: queue id:uLjFMoOU7Wk7bOAd4zpHb3ccRMJHBtR6[2017-12-23 19:01:01] local.INFO: queue id:87ULqPBObFmGr16nl5wxFVOi71zGCeRM[2017-12-23 19:01:01] local.INFO: queue id:9UVl0muQLzBqlRI99rChGW2ElXwVEMIE[2017-12-23 19:01:01] local.INFO: queue id:a0vgyZuz9HtmH7DGHEpXqesFTcQU3QAF[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:2cXuXxopPkgYiV4WO8gv9CJ6CwXeKtYL[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:9acTAYa8cxpJX6Q3Gb1sULokotP8reqZ[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:BPHQvBboChlv4gr2I0vyLVyw9bijtTYJ[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:Fm6tNajdxYKtdQbDMYDmwWJFLnNikRyg[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:nyAbcvSkBVPbaH3e2ItQkoLJlP1ficib[2017-12-23 19:01:01] local.INFO: queue id:WBHsSVZtP43569UoPXxfLLJcvYmPW7cP[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:bliPnKcRSDApwVmKLNxEhaKelhm0RDEY[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:eOAoQucEIwRz9uZ64xm6IDKgiqj9Xc3W[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:lzise9EiqQqINrhALbmAI4qNg7qylpb2[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:WXYKvcfOhS1pPnwOwUTsenoMv5l5EUXe[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:XtH5JiwLgnrwWzI02Oyi70pihAOkuJUD[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:9ehmE5HImlpNubpY0xWN8UVrOzxeMqws[2017-12-23 19:01:01] local.INFO: queue id:C1sK87cpZl47edLA0zhfo7PJ9MIEcoyx[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:2kwl51oH4lyyRrljCReGUCkNiJRDl7oe[2017-12-23 19:01:01] local.INFO: queue id:ObRpoqrYTPYiyv2delMlOXu3sAPpWJlN[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:6qgu6W3TapLjSrt688yv9HRXvDDLxntz[2017-12-23 19:01:01] local.INFO: queue id:wiTlERhwn7s9cQkfUF9lLlNADpXjKncI[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:ZSLW0VLFBDpL4wjTJzu3Yb3V45pNe807[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:qhZlXLGfGWRluIeNm7VbllmTJZYb2h5n[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:LUx1IByD3L2psNl9BZwHhk2knXyRPzW6[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:M2RESPjyo5hpAFxxL0EQbWwsUq4jpmWn[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:hUsGaiIAOO6ZfGQc5kGHGpsv5RpoRPYO[2017-12-23 19:01:01] local.INFO: queue id:cEHJsOy6bLeZ4NbncPziaHqlarMeyyEF[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:w4bkFiJKMU5saqG2xKN3ZRL5BYXGATMk[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:0zBuwbxlrEhhxKfYBkVyTY4z35f154sI[2017-12-23 19:01:01] local.INFO: queue id:mvoZvyDPvq4tcPjEy9G7PMtH3MwPkPik[2017-12-23 19:01:01] local.INFO: invoke SendFile3[2017-12-23 19:01:01] local.INFO: queue id:TLvF74eeidECWKtjZqWvW03UJTRPTL9r[2017-12-23 19:01:01] local.INFO: queue id:me8wyPfgcz0nf9xvcXz0hf2xVxqa1FFS

這 8 個進程并發處理隊列,但從打印的日志看,沒有出現同樣的 ID. 我們再看一下 Laravel 如何使用 Redis 處理隊列的。

分析一下 Laravel 隊列的處理

Laravel 中入隊列方法

public function pushRaw($payload, $queue = null, array $options = []) $this- getConnection()- rpush($this- getQueue($queue), $payload); return Arr::get(json_decode($payload, true), id }

用的是 Redis 的 rpush 命令。

Laravel 中取隊列方法

public function pop($queue = null) $original = $queue ?: $this- default;  $queue = $this- getQueue($queue);  $this- migrateExpiredJobs($queue. :delayed , $queue);  if (! is_null($this- expire)) { $this- migrateExpiredJobs($queue. :reserved , $queue); list($job, $reserved) = $this- getConnection()- eval( LuaScripts::pop(), 2, $queue, $queue. :reserved , $this- getTime() + $this- expire if ($reserved) { return new RedisJob($this- container, $this, $job, $reserved, $original);}

這里用的是 lua 腳本取隊列,如下:

public static function pop() return LUA local job = redis.call( lpop , KEYS[1])local reserved = falseif(job ~= false) thenreserved = cjson.decode(job)reserved[ attempts ] = reserved[ attempts ] + 1reserved = cjson.encode(reserved)redis.call( zadd , KEYS[2], ARGV[1], reserved)return {job, reserved}}

那么結論是:從 Laravel 的處理方式和打印的日志結果看,即使多個進程讀取同一個隊列,也不會讀取到一樣的數據。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

如何解決Laravel的throttle中間件失效的問題

如何通過laravel來創建自定義artisan make的命令新建類文件

如何PHP中Laravel框架實現supervisor執行異步進程

以上就是Laravel Redis 多個進程同時取隊列的問題解析的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频不卡| 日韩电影在线观看中文字幕| 亚洲一区二区三区xxx视频| 日韩电影免费观看在线| 国产一区二区久久精品| 欧美性xxxxxx| 亚洲欧洲av一区二区| 久久视频在线免费观看| 成人夜晚看av| 久久国产精品久久久久久| 国产精品精品国产| 日韩精品在线视频| 亚洲毛片在线观看.| 欧美在线视频网| 91精品综合视频| 毛片精品免费在线观看| 国产精品自拍偷拍视频| 久久福利视频导航| 91免费精品视频| 久久精品夜夜夜夜夜久久| 国产精品电影观看| 欧美性开放视频| 69久久夜色精品国产7777| 日韩精品小视频| 久久精品视频在线观看| 久久亚洲国产成人| 精品国产老师黑色丝袜高跟鞋| 亚洲欧美日韩一区二区在线| 亚洲精品一区在线观看香蕉| 日韩在线观看电影| 亚洲欧美日韩图片| 国产精品久久久久久五月尺| 欧美成人免费播放| 欧美日韩xxx| 日韩在线观看免费av| 成人免费视频网| 91免费欧美精品| 高清一区二区三区日本久| 欧美一区二区大胆人体摄影专业网站| 午夜精品久久久久久久99热| 欧美激情图片区| 伊人久久五月天| 欧美在线播放视频| 欧美性猛交xxxx乱大交3| 亚洲视频电影图片偷拍一区| 亚洲国产精品人人爽夜夜爽| 欧美日韩性视频在线| 国产午夜精品美女视频明星a级| 欧美有码在线视频| 欧美亚洲伦理www| 精品夜色国产国偷在线| 国产午夜精品视频免费不卡69堂| 国产一区香蕉久久| 国产亚洲一区二区精品| 国产精品流白浆视频| 欧美精品激情blacked18| 精品国产乱码久久久久久天美| 国产欧美日韩综合精品| 国产一区二区三区中文| 国产精品网站视频| 亚洲电影免费观看高清完整版| 国产成人欧美在线观看| 亚洲欧美精品中文字幕在线| 欧美日本高清一区| 国产精品第100页| 91在线高清免费观看| 久久久精品美女| 久久91精品国产91久久跳| 日韩视频第一页| 国产日韩换脸av一区在线观看| 97婷婷涩涩精品一区| 亚洲精品v天堂中文字幕| 国产成+人+综合+亚洲欧美丁香花| 日韩在线免费观看视频| 欧美一区二区视频97| 欧美黄色片视频| 狠狠色噜噜狠狠狠狠97| 精品久久久香蕉免费精品视频| 欧美日韩第一页| 国产69久久精品成人看| 欧美性猛交99久久久久99按摩| 国产亚洲a∨片在线观看| 久久久久99精品久久久久| 日韩在线观看电影| 国产精品入口尤物| 国产精品高潮呻吟久久av黑人| 668精品在线视频| 久久精品视频在线| 久久在精品线影院精品国产| 疯狂蹂躏欧美一区二区精品| 亚洲xxxx视频| 欧美性资源免费| 国产成人高潮免费观看精品| 亚洲女人天堂成人av在线| 国产精品视频yy9099| 欧美高清第一页| 热久久视久久精品18亚洲精品| 青草青草久热精品视频在线网站| 亚洲va欧美va国产综合久久| 精品国产一区二区三区四区在线观看| 另类图片亚洲另类| 91精品国产成人www| 日韩精品中文在线观看| 91热精品视频| 成人激情在线观看| 亚洲女在线观看| 国产精品久久久久久久久久99| 亚洲激情自拍图| 国产91色在线|免| 欧美激情视频一区| 成人免费在线视频网址| 色狠狠av一区二区三区香蕉蜜桃| 97在线视频精品| 97热在线精品视频在线观看| 亚洲最大福利视频| 欧美视频在线观看免费| 亚洲最大的成人网| 97在线精品国自产拍中文| 国产精品高潮呻吟久久av黑人| 欧美亚洲视频在线看网址| 欧美网站在线观看| 中文字幕亚洲色图| 麻豆精品精华液| 黑人与娇小精品av专区| 最近2019免费中文字幕视频三| 亚洲成人免费网站| 亚洲精选一区二区| 久久影视电视剧免费网站清宫辞电视| 国产精品丝袜久久久久久不卡| 国产一区二区三区在线观看网站| 91日本在线观看| 欧美性生活大片免费观看网址| 日本在线观看天堂男亚洲| 久久久欧美精品| 国产激情久久久| 91色视频在线观看| 久久人人爽人人爽人人片av高请| 精品久久中文字幕久久av| 欧美日本亚洲视频| 久久久久久国产三级电影| 国产91精品在线播放| 久久成人一区二区| 最近中文字幕日韩精品| 午夜精品www| 91香蕉嫩草影院入口| 精品女厕一区二区三区| 日本欧美国产在线| 亚洲成年人影院在线| 色综合伊人色综合网| 久久精品免费播放| 日本不卡免费高清视频| 色综合伊人色综合网站| 精品日韩中文字幕| 国产亚洲激情在线| 欧美日韩性视频| 亚洲电影中文字幕| 国产大片精品免费永久看nba| 成人福利视频网| 成人福利视频网| 精品自拍视频在线观看| 欧美激情一区二区三区高清视频| 中文欧美在线视频| 在线免费观看羞羞视频一区二区| 日韩在线观看精品|