redis延遲隊列php,redis延遲隊列如何實現

本文目錄一覽:

php使用redis的有序集合zset實現延遲隊列

延遲隊列就是個帶延遲功能的消息隊列,相對於普通隊列,它可以在指定時間消費掉消息。

我們通過redis的有序集合zset來實現簡單的延遲隊列,將消息數據序列化,作為zset的value,把消息處理時間作為score,每次通過zRangeByScore獲取一條消息進行處理。

然後,我們寫一個php腳本,用來處理隊列中的任務。

TP6隊列think-queue(延時隊列/自動取消訂單/php自動操作)

什麼是延時隊列?顧名思義:首先它要具有隊列的特性,再給它附加一個延遲消費隊列消息的功能,也就是說可以指定隊列中的消息在哪個時間點被消費。

延時隊列在項目中的應用還是比較多的,尤其像電商類平台訂單成功後,在30分鐘內沒有支付,自動取消訂單

外賣平台發送訂餐通知,下單成功後60s給用戶推送短信。

如果訂單一直處於某一個未完結狀態時,及時處理關單,並退還庫存

淘寶新建商戶一個月內還沒上傳商品信息,將凍結商鋪等

……

上邊的這些場景都可以應用延時隊列解決。

1.安裝think-queue

2.安裝redis

3.配置,項目\config\queue.php

4.創建隊列和推送

新增 \app\job\test.php 控制器,在該控制器中添加 fire 方法

fire方法是消息隊列默認調用的方法

5.在項目中進行調用延時隊列方法

6.添加監聽 – 重要必要有這個監聽,Queue::later才有效

Redis使用zset有序集合做延遲隊列

把所有需要在未來執行的任務都添加到有序集合裡面,並將任務的執行時間設置為分值,另外再使用一個進程來查找有序集合裡面是否存在可以立即執行的任務,如果有的話,就從有序集合裡面移除那個任務,並將它添加到適當的任務隊列裡面。

–出自《Redis實戰》

創建函數 addFutureJob,負責將延遲任務添加到有序集合job中。

有序集合里存儲的元素,可以使用json格式保存。

內部結構可以類似如下這種:

參數:

$job: 存儲延遲任務的有序集合的名字,叫job

$queue: 當任務到達執行時間時,轉存到具體的隊列里執行

$fun: 負責執行的函數名稱或匿名函數

$time: 延遲任務執行的具體時間

$parameter: 傳遞的參數

執行腳本後,將存儲到job 這個有序集合里

另一個腳本中,讀取job集合,檢查是否有需要執行的任務

這個函數getQueue()的基本流程是這樣:

(1)根據分數從小到大排列,讀取第一個元素。如果元素不存在返回false

(2) 如果元素任務存在,並且它的分數(執行時間)小於等於當前時間,說明這個任務可以執行了。

(3) json轉化成數組,讀取任務的queue參數,將它添加到指定的隊列里,然後從job中刪除這個任務。

(4) 上述轉移操作時,如果成功,記錄日誌。while繼續循環檢查job有序集合

(5) 如果轉移操作失敗,返回false

(6) 後續沒有要執行的任務時,停止循環,返回false

此處循環讀取也可以使用zrangeByScore()函數,根據分數範圍進行讀取返回集合內的指定元素。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/275899.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 19:37
下一篇 2024-12-17 19:37

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Python中的隊列定義

    本篇文章旨在深入闡述Python中隊列的定義及其應用,包括隊列的定義、隊列的類型、隊列的操作以及隊列的應用。同時,我們也會為您提供Python代碼示例。 一、隊列的定義 隊列是一種…

    編程 2025-04-29
  • RabbitMQ和Yii2的消息隊列應用

    本文將探討RabbitMQ和Yii2之間的消息隊列應用。從概念、安裝和配置、使用實例等多個方面詳細講解,幫助讀者了解和掌握RabbitMQ和Yii2的消息隊列應用。 一、Rabbi…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Django ORM如何實現或的條件查詢

    在我們使用Django進行數據庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Python一次性輸入10個數如何實現?

    Python提供了多種方法進行輸入,可以手動逐個輸入,也可以一次性輸入多個數。在需要輸入大量數據時,一次性輸入十個數就非常方便。下面我們從多個方面來講解如何一次性輸入10個數。 一…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • 在CentOS上安裝Redis

    Redis是一款非關係型數據庫,它支持多種數據結構,包括字符串、哈希、列表、集合、有序集合等。Redis運行內存內並且支持數據持久化,它還可以應用於緩存、消息隊列等場景。本文將介紹…

    編程 2025-04-28
  • 如何實現van-picker點擊遮罩不關閉

    van-picker是一個非常實用的Vue組件,但默認情況下,點擊遮罩會自動關閉選擇器。本文將介紹如何通過代碼實現van-picker點擊遮罩不關閉的功能。 一、通過覆蓋遮罩實現 …

    編程 2025-04-27

發表回復

登錄後才能評論