Laravel源碼分析 - Redis延遲隊列(一)

延遲隊列,首先它是一個隊列。然后其任務(wù)可以延遲被執(zhí)行潮梯。
實現(xiàn)隊列骗灶,以及延遲隊列的方式有很多種,基于Redis的方式也是比較常見秉馏,并且實現(xiàn)方式也比較簡單耙旦。
通過三篇文章,分析基于Laravel框架實現(xiàn)Redis的延遲隊列
第一篇: 依據(jù)官網(wǎng)介紹萝究,實現(xiàn)一個簡單的Redis延遲隊列
第二篇:添加隊列任務(wù)的源碼分析
第三篇:監(jiān)聽隊列的源碼分析免都,即消費的源碼分析

依據(jù)官網(wǎng)介紹,實現(xiàn)一個簡單的Redis延遲隊列功能

確保當前已經(jīng)部署好運行Laravel5.8版本的lnmp以及redis環(huán)境,根據(jù)官網(wǎng)內(nèi)容,配置并創(chuàng)建一個基于Redis的延遲隊列

1. 配置.env文件

省略其他配置疙描,這里配置Redis的host,password业舍,port為自己的配置,暫時添加一個REDIS_PREFIX=為空

REDIS_HOST=172.17.0.4
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_PREFIX=

QUEUE_CONNECTION=redis # 指定queue的默認服務(wù)為redis

config/queue.php配置隊列

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => env('REDIS_QUEUE', 'default'),
            'retry_after' => 90,
            'block_for' => null,
        ],

ps:默認當前已啟動Redis服務(wù)

2. 創(chuàng)建一個Job任務(wù)

通過artisan命令創(chuàng)建一個SendEmailJob.php腳本命令:php artisan make:job SendEmailJob
執(zhí)行完成之后升酣,會在app/Jobs目錄下舷暮,創(chuàng)建一個SendEmailJob.php腳本
修改腳本app/Jobs/SendEmailJob.php如下:

<?php

namespace App\Jobs;

use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    public function __construct()
    {
        //
    }
    public function handle()
    {
        $nowStr = Carbon::now()->toDateTimeString();
        $res = sprintf('Successful email delivery: %s', $nowStr);
        echo $res;
    }
}
3. 創(chuàng)建控制器

通過artisan命令創(chuàng)建一個控制器:php artisan make:controller Blog/QueueController
修改app/Http/Controllers/Blog/QueueController.php代碼如下:

<?php

namespace App\Http\Controllers\Blog;

use App\Jobs\SendEmailJob;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class QueueController extends Controller
{
    public function send(Request $request)
    {
        $nowStr = Carbon::now()->toDateTimeString();
        $res = sprintf('Starting email delivery: %s', $nowStr);
        SendEmailJob::dispatch()->delay(now()->addSeconds(20));
        dd($res);
    }
}

send方法就是延遲20s執(zhí)行SendEmailJob任務(wù)

4. 修改路由

編輯 routes/web.php代碼如下:

<?php
Route::get('/blog/send', 'Blog\QueueController@send');
5. 命令行打開一個Redis客戶端
root@9c8ee64d2bc6:/data# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>

當前Redis中,暫無任何內(nèi)容

6. 監(jiān)聽隊列

通過執(zhí)行artisan命令:php artisan queue:work持續(xù)監(jiān)聽隊列噩茄,沒有加任務(wù)參數(shù)下面,默認使用config/queue.php中的'default' => env('QUEUE_CONNECTION', 'sync'),已在.env中配置了QUEUE_CONNECTION為redis。

監(jiān)聽隊列

7. 運行http://localhost/blog/send
執(zhí)行任務(wù)

顯示當前時間為2019-10-03 10:47:12

8. 通過redis-cli查看

運行完http://localhost/blog/send](http://localhost/blog/send之后绩聘,查看redis中存在一個key為queues:default:delayed的zset類型的數(shù)據(jù)沥割,值為SendEmailJob對象序列化后的值

SendEmailJob對象序列化

score的值為延遲后的時間戳1570070852,日期格式為2019-10-03 10:47:32

9. 查看任務(wù)隊列的監(jiān)聽
20s之后執(zhí)行

顯示當前執(zhí)行時間為2019-10-03 10:47:33凿菩,忽略其他耗時~

10. 再次通過redis-cli查看reds的內(nèi)容
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>

可見机杜,之前的任務(wù)已被消費,并從redis中刪除

至此衅谷,已經(jīng)實現(xiàn)了一個基于Redis的延遲隊列椒拗,有任何問題或建議,歡迎評論~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末获黔,一起剝皮案震驚了整個濱河市蚀苛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玷氏,老刑警劉巖堵未,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盏触,居然都是意外死亡渗蟹,警方通過查閱死者的電腦和手機侦厚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拙徽,“玉大人,你說我怎么就攤上這事诗宣”炫拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵召庞,是天一觀的道長岛心。 經(jīng)常有香客問我,道長篮灼,這世上最難降的妖魔是什么忘古? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮诅诱,結(jié)果婚禮上髓堪,老公的妹妹穿的比我還像新娘。我一直安慰自己娘荡,他們只是感情好干旁,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炮沐,像睡著了一般争群。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上大年,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天换薄,我揣著相機與錄音,去河邊找鬼翔试。 笑死轻要,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的遏餐。 我是一名探鬼主播伦腐,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼失都!你這毒婦竟也來了柏蘑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤粹庞,失蹤者是張志新(化名)和其女友劉穎咳焚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庞溜,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡革半,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年碑定,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片又官。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡延刘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出六敬,到底是詐尸還是另有隱情碘赖,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布外构,位于F島的核電站普泡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏审编。R本人自食惡果不足惜撼班,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垒酬。 院中可真熱鬧砰嘁,春花似錦、人聲如沸伤溉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乱顾。三九已至板祝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間走净,已是汗流浹背券时。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伏伯,地道東北人橘洞。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像说搅,于是被迫代替她去往敵國和親炸枣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容