目錄
redis 佇列的資料結構
List 鍊錶
Zset 有序集合
laravel 佇列服務的任務排程
laravel 佇列服務的整體流程
建立任務
queue 設定
任務類別的建立
首頁 php框架 Laravel laravel框架中隊列的用法介紹(附程式碼)

laravel框架中隊列的用法介紹(附程式碼)

Aug 28, 2018 pm 01:37 PM
laravel php redis

這篇文章帶給大家的內容是關於laravel框架中隊列的用法介紹(附代碼) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

在實際的專案開發中,我們經常會遇到需要輕量級佇列的情形,例如發送簡訊、發送電子郵件等,這些任務不足以使用kafka、RabbitMQ 等重量級的訊息佇列,但是又的確需要非同步、重試、並發控制等功能。通常來說,我們經常使用 Redis、Beanstalk、Amazon SQS 來實現相關功能,laravel 為此對不同的後台隊列服務提供統一的 API,本文將會介紹應用最廣泛的 redis 隊列。

在講解 laravel 的隊列服務之前,我們要先說說基於 redis 的隊列服務。首先,redis設計用來做快取的,但由於它本身的某種特性使得它可以用來做訊息佇列

redis 佇列的資料結構

List 鍊錶

redis 做訊息佇列的特性例如FIFO(先入先出)很容易實現,只需要一個list 物件從頭取數據,從尾部塞資料即可。

相關的指令:(1)左側入右側出:lpush/rpop;(2)右側入左側出:rpush/lpop。

這個簡單的訊息佇列很容易實作。

Zset 有序集合

有些任務場景,並不需要任務立刻執行,而是需要延遲執行;有些任務很重要,需要在任務失敗的時候重新嘗試。這些功能僅僅依靠 list 是無法完成的。這個時候,就需要 redis 的有序集合。

Redis 有序集合和 Redis 集合類似,是不包含相同字串的集合。它們的差異是,每個有序集合的成員都關聯著一個評分 score,這個評分用於把有序集合中的成員按最低分到最高分排列。

單看有序集合和延遲任務並無關係,但是可以將有序集合的評分score 設定為延時任務開啟的時間,之後輪詢這個有序集合,將到期的任務拿出來處理,這樣就實現了延遲任務的功能。

對於重要的需要重試的任務,在任務執行之前,會將該任務放入有序集合中,設定任務最長的執行時間。若任務順利執行完畢,該任務會在有序集合中刪除。如果任務沒有在規定時間內完成,那麼該有序集合的任務將會被重新放入佇列中。

相關指令:

(1) ZADD 新增一個或多個成員到有序集合,或者如果它已經存在更新其分數。

(2) ZRANGEBYSCORE 按分數傳回一個成員範圍的有序集合。

(3) ZREMRANGEBYRANK 在給定的索引之內刪除所有成員的有序集合。

laravel 佇列服務的任務排程

佇列服務的任務排程過程如下:

laravel框架中隊列的用法介紹(附程式碼)

laravel 的佇列服務由兩個進程控制,一個是生產者,一個是消費者。這兩個進程操縱了 redis 三個隊列,其中一個 List,負責即時任務,兩個 Zset,負責延時任務與待處理任務。

生產者負責向 redis 推送任務,如果是即時任務,預設就會向 queue:default 推送;如果是延時任務,就會向 queue:default:delayed 推送。

消費者輪詢兩個隊列,不斷的從隊列中取出任務,先把任務放入 queue:default:reserved 中,再執行相關任務。如果任務執行成功,就會刪除 queue:default:reserved 中的任務,否則會重新放入 queue:default:delayed 佇列中。

laravel 佇列服務的整體流程

任務分發流程:

laravel框架中隊列的用法介紹(附程式碼)

任務處理器運作:

laravel框架中隊列的用法介紹(附程式碼)

建立任務

queue 設定

'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => 'default',
        'retry_after' => 90,
    ],
登入後複製

在config/queue.php中進行配置
一般來說,預設的redis 配置如上,connection 是database 中redis 的連接名稱;queue 是redis 中的隊列名稱,值得注意的是,如果使用的是redis 集群的話,這個需要使用key hash tag,也就是{default};當任務運行超過retry_after這個時間後,該任務會被重新放入隊列當中。

任務類別的建立

任務類別的結構很簡單,一般來說只會包含一個讓佇列用來呼叫此任務的 handle 方法。

如果想要使得任務被推送到佇列中,而不是同步執行,那麼就需要實作 IlluminateContractsQueueShouldQueue 介面。

如果想要讓任務推送到特定的連線中,例如 redis 或 sqs,那麼需要設定 conneciton 變數。

如果想要讓任務推送到特定的佇列中去,可以設定 queue 變數。

如果想要让任务延迟推送,那么需要设置 delay 变量。

如果想要设置任务至多重试的次数,可以使用 tries 变量;

如果想要设置任务可以运行的最大秒数,那么可以使用 timeout 参数。

如果想要手动访问队列,可以使用 trait : IlluminateQueueInteractsWithQueue。

任务的分发
分发服务
写好任务类后,就能通过 dispatch 辅助函数来分发它了。唯一需要传递给 dispatch 的参数是这个任务类的实例:

class PodcastController extends Controller
{
    public function store(Request $request)
    {
        // 创建播客...

        ProcessPodcast::dispatch($podcast);
    }
}
登入後複製

如果想延迟执行一个队列中的任务,可以用任务实例的 delay 方法。

 ProcessPodcast::dispatch($podcast)
                ->delay(Carbon::now()->addMinutes(10));
登入後複製

通过推送任务到不同的队列,可以给队列任务分类,甚至可以控制给不同的队列分配多少任务。要指定队列的话,就调用任务实例的 onQueue 方法:

ProcessPodcast::dispatch($podcast)->onQueue('processing');
登入後複製

如果使用了多个队列连接,可以将任务推到指定连接。要指定连接的话,可以在分发任务的时候使用 onConnection 方法:

ProcessPodcast::dispatch($podcast)->onConnection('redis
');
登入後複製

以上是laravel框架中隊列的用法介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP的未來:改編和創新 PHP的未來:改編和創新 Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

php:死亡還是簡單地適應? php:死亡還是簡單地適應? Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

redis指令怎麼用 redis指令怎麼用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

redis怎麼啟動服務器 redis怎麼啟動服務器 Apr 10, 2025 pm 08:12 PM

啟動 Redis 服務器的步驟包括:根據操作系統安裝 Redis。通過 redis-server(Linux/macOS)或 redis-server.exe(Windows)啟動 Redis 服務。使用 redis-cli ping(Linux/macOS)或 redis-cli.exe ping(Windows)命令檢查服務狀態。使用 Redis 客戶端,如 redis-cli、Python 或 Node.js,訪問服務器。

redis怎麼讀源碼 redis怎麼讀源碼 Apr 10, 2025 pm 08:27 PM

理解 Redis 源碼的最佳方法是逐步進行:熟悉 Redis 基礎知識。選擇一個特定的模塊或功能作為起點。從模塊或功能的入口點開始,逐行查看代碼。通過函數調用鏈查看代碼。熟悉 Redis 使用的底層數據結構。識別 Redis 使用的算法。

redis怎麼使用鎖 redis怎麼使用鎖 Apr 10, 2025 pm 08:39 PM

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

See all articles