1. 程式人生 > >Laravel中用Redis來做任務佇列

Laravel中用Redis來做任務佇列

利用Redis可以很方便的實現一個任務佇列,但是在Laravel中,Redis的佇列總會出現一個任務多次執行的問題。究其原因是它寫死了reserved的時長,也就是如果1分鐘後任務沒有執行完成,那麼這個任務就會被重新放回佇列。下面是佇列的簡單使用和執行原理。

設定

設定佇列使用Redis非常容易,在app/config/queue.php中配置

...
'default' => 'redis',
...
'connections' => array(
    ...
    'redis' => array(
        'driver' => 'redis',
        'queue'  => 'waa',
    ),
),

即可。

使用

使用時不需要多配置,只要寫好Queue類和其fire方法,在需要的位置出隊即可。具體方法可以看這裡

class SendEmail {

    public function fire($job, $data)
    {
        //
        $job->delete();
    }

}

Queue::push('[email protected]', array('message' => $message));

流程

Laravel利用artisan命令來執行出隊操作,然後進行任務的執行。方法呼叫如下:

  1. artisan queue:work
  2. WorkerCommand:fire()
  3. Worker:pop()
  4. Worker:getNextJob()
  5. RedisQueue:pop()
  6. Worker:process()

我遇到的問題就在這裡,在RedisQueue:pop()方法中,有這樣一句:

$this->redis->zadd($queue.':reserved', $this->getTime() + 60, $job);

這裡將當前執行的任務放到另外一個reserved佇列中,超時時間是60s。也就是說,如果60s後這個任務沒有被刪除掉,則任務會重新被放入佇列中來。因此,在實際的使用過程中,任務很可能被多次執行。解決的辦法是

class SendEmail {

    public function fire($job, $data)
    {
        $job->delete();
        // job 
    }

}

即先刪除這個任務,再開始執行任務。

相關推薦

Laravel中用Redis任務佇列

利用Redis可以很方便的實現一個任務佇列,但是在Laravel中,Redis的佇列總會出現一個任務多次執行的問題。究其原因是它寫死了reserved的時長,也就是如果1分鐘後任務沒有執行完成,那麼這個任務就會被重新放回佇列。下面是佇列的簡單使用和執行原理。 設定 設

使用Redis任務佇列(Golang)

        在上篇用純go在本機模擬了下分散式佇列的東西。這裡補上Redis佇列部份。 用Redis做佇列有下面三個問題需解決: 1. 佇列構建      使用Redis的RPUSH/LPOP來解決  2. 引數傳遞/解析    客戶端將JOSN引數存入Redis,Se

Redis可以用什麼?(摘自http://www.lianpenglin.cc廉鵬林部落格)

Redis 是網際網路技術領域使用最為廣泛的儲存中介軟體,它是「Remote Dictionary Service」的首字母縮寫,也就是「遠端字典服務」。Redis 以其超高的效能、完美的文件、簡潔易懂的原始碼和豐富的客戶端庫支援在開源中介軟體領域廣受好評。國內外很多大型網際網路公司都在使用 Redis,比如

Redis訊息佇列

一、訊息佇列的適用場景 非同步處理,應用解耦,流量削鋒和訊息通訊 四個場景。 二、藉助 Redis 阻塞佇列實現簡單的訊息佇列功能 redis相關:java程式碼操作redis資料庫 1、引入redis 依賴包。 2、java程式碼操作redis阻塞佇列。 ja

一次Redis任務佇列積壓的問題分析與解決

目前的流程:   兩個Redis: Redis1: 儲存詞條的summary資訊 Redis2:任務佇列,用於暫存Redis中沒有summary,需要進行處理獲取summary, 佇列用的Redis的list結構   兩個程序: 1、 程序1:服務

redis可以用什麼?(一)

redis可以用來做什麼?以部落格帖子為例大概說說,當然redis的其他功能還有很多,後續在做介紹。 Redis 是網際網路技術領域使用最為廣泛的儲存中介軟體,它是「Remote Dictionary Service」的首字母縮寫,也就是「遠端字典服務」。 記錄帖子的點贊數、評論數和點選數 (hash)

Redis實現分散式鎖與任務佇列的思路

一, 實現思路 1.Redis實現分散式鎖思路 思路很簡單,主要用到的redis函式是setnx(),這個應該是實現分散式鎖最主要的函式。首先是將某一任務標識名(這裡用Lock:order作為標識名的例子)作為鍵存到redis裡,併為其設個過期時間,如果是還有Lock:order請求過來,先

Java執行緒實現Redis任務佇列(生產者消費者)

注:接上篇IDEA整合Redis,本篇實現Redis的任務佇列,Redis連線池具體配置看上篇。 一:寫一個Jedis的工具類JedisUtil,將Jedis中的部分方法實現,程式碼如下: package com.wq.Util; import com.wq.RedisP

分散式非同步任務佇列 Celery + rabbitmq (or redis )

最近的專案要使用非同步的任務佇列,初步選用了Celery,比較輕量級,但是對Task,Broker,Worker等概念有些理解的不透徹,找到以下文章,甚是透徹。  當我們需要處理一些比較耗時的任務時,我們就需要考慮啟用“非同步”這個概念。  比如以下兩種情況: 一,頻繁

Redis非同步佇列

首先,redis設計用來做快取的,但是由於它自身的某種特性使得它可以用來做訊息佇列,它有幾個阻塞式的API可以使用,正是這些阻塞式的API讓其有能力做訊息佇列;另外,做訊息佇列的其他特性例如FIFO(先入先出)也很容易實現,只需要一個list物件從頭取資料,從尾部塞資料即可;

李笑Candy Box任務領糖果簡明教程

candy.one網站目前集成了PRS、GCT、MEX、TCT、AIT、MTN、BTO、EDS、IOST、NONT等諸多token,它們在一塊統稱為Candy Box,即糖果盒。 與網站相關聯的交易所有BigOne、BitMEX、幣安網、FCOIN、OKEX、

關於redis中使用鎖機制,( 實現分散式鎖和任務佇列

場景:       電商網站上有很多秒殺活動,會迎來一個使用者請求的高峰期,可能會有幾十萬幾百萬的併發量,來搶這個手機,在高併發的情形下會對資料庫伺服器或者是檔案伺服器應用伺服器造成巨大的壓力,嚴重時說不定就宕機了;       另一個問題是,秒殺的東西都是有量的,一款手

Redis實現分散式鎖思路和任務佇列

 二、實現思路  1.Redis實現分散式鎖思路    思路很簡單,主要用到的redis函式是setnx(),這個應該是實現分散式鎖最主要的函式。首先是將某一任務標識名(這裡用Lock:order作為標識名的例子)作為鍵存到redis裡,併為其設個過期時間,如果是還有Lock

非同步系統的效能調優記錄(redis訊息佇列)

系統背景: 生產者往redis丟訊息,消費者從redis取訊息傳送 redis使用list作為訊息佇列,佇列數N個 每種接入系統分配2種(傳送,重發),分別3個固定佇列,優先順序高中低,該3個佇列由一個執行緒處理,通過分配的時間片大小去體現優先順序 不同接入系

Redis 它是什麼?它用什麼?它的優勢與短板如何?

問題導讀:1.Redis 是什麼?2 Redis用來做什麼?3 Redis的優點?4 Redis的缺點? 閱讀目的: 對什麼是記憶體型資料庫有概念性的認知。?Redis 是什麼?     通常而言目前的資料庫分類有幾種,包括 SQL/NSQL,,關係資料庫,鍵值資料庫等等 等,分類的標準也不以,Redis

使用yii2-queue結合redis實現佇列功能

開發十年,就只剩下這套架構體系了! >>>   

程式設計師過關斬將--redis訊息佇列,香嗎?

Redis訊息佇列 在程式設計師這個圈子打拼了太多年,見過太多的程式設計師使用redis,其中一部分喜歡把redis做快取(cache)使用,其中最典型的當屬儲存使用者session,除此之外,把redis作為訊息佇列使用也不在少數,可見redis在網際網路中應用是多麼的廣泛。 redis作為訊息佇列使用,r

靈感襲,基於Redis的分散式延遲佇列

延遲佇列 延遲佇列,也就是一定時間之後將訊息體放入佇列,然後消費者才能正常消費。比如1分鐘之後傳送簡訊,傳送郵件,檢測資料狀態等。 Redisson Delayed Queue 如果你專案中使用了redisson,那麼恭喜你,使用延遲佇列將非常的簡單。   基於Redis的Redisso

使用Redis訊息佇列

基於記憶體的單執行緒資料庫,使Redis的執行緒安全性與效能極高。而Redis的雙向連結串列資料型別(List)天生就可作為訊息佇列儲存訊息. 在這裡就不說訊息佇列的等等一些優點。但是補充一下Redis的List型別的幾個命令,你可以指定將一個元素投送到列表的頭部(左邊)或者尾部(右邊),當然也可以指定從列

靈感襲,基於Redis的分散式延遲佇列(續)

背景 上一篇(靈感來襲,基於Redis的分散式延遲佇列)講述了基於Java DelayQueue和Redis實現了分散式延遲佇列,這種方案實現比較簡單,應用於延遲小,訊息量不大的場景是沒問題的,畢竟Java DelayQueue是佔用記憶體的。針對現用方案的不足,於是利用Redis的Sorted S