php redis實現延遲佇列

2021-09-13 19:04:26 字數 2658 閱讀 8522

基於redis有序集實現延遲任務執行,比如某個時間給某個使用者發簡訊,訂單過期處理,等等

我是在tp5框架上寫的,實現起來很簡單,對於一些不是很複雜的應用足夠了,目前在公司專案中使用,後台程序並沒有實現多程序,

不多說,貼**,不回排版,見諒

1、命令列指令碼 執行方法:php think delay-queue queuename(這是有序集的key)

use think\console\command;

use think\console\input;

use think\console\output;

use think\db;

class delayqueueworker extends command

protected function execute(input $input, output $output)

}} 庫類目錄結構

config.php 裡是redis連線引數配置

redishandler.php只實現有序集的操作,重連機制還沒有實現

class redishandler

final private function __clone() {}

public static function getinstance()

return self::$_instance;

}/**

* @param string $key 有序集key

* @param number $score 排序值

* @param string $value 格式化的資料

* @return int

*/public function zadd($key, $score, $value)

/*** 獲取有序集資料

* @param $key

* @param $start

* @param $end

* @param null $withscores

* @return array

*/public function zrange($key, $start, $end, $withscores = null)

/*** 刪除有序集資料

* @param $key

* @param $member

* @return int

*/public function zrem($key,$member)

} 延遲佇列類

class delayqueue

final private function __clone() {}

public static function getinstance($queue = '')

return self::$_instance;

}/**

* 新增任務資訊到佇列

** demo delayqueue::getinstance('test')->addtask(

* strtotime('2018-05-02 20:55:20'),

* ['abc'=>111]

* );

** @param $jobclass

* @param int $runtime 執行時間

* @param array $args

*/public function addtask($jobclass, $runtime, $args = null)

/*** 執行job

* @return bool

*/public function perform()

$jobinfo = unserialize($result[0]);

print_r('job: '.$jobinfo['class'].' will run at: '. date('y-m-d h:i:s',$jobinfo['runtime']).php_eol);

$jobclass = $jobinfo['class'];

if(!@class_exists($jobclass))

// 到時間執行

if (time() >= $jobinfo['runtime'])

}return false;

}} 非同步任務基類:

class delayjob

public function setpayload($args = null)

} 所有非同步執行的任務都解除安裝job目錄下,且要繼承delayjob,你可以實現任何你想延遲執行的任務

如:class test extends delayjob}

使用方法:

假設使用者建立了乙個訂單,訂單在10分鐘後失效,那麼在訂單建立後加入:

delayqueue::getinstance('close_order')->addtask(

strtotime('2018-05-02 20:55:20'), // 訂單失效時間

['order_id'=>123456] // 傳遞給job的引數

);

close_order 是有序集的key

命令列啟動程序

php think delay-queue close_order

php redis的有序集合實現延遲佇列

延遲佇列就是個帶延遲功能的訊息佇列,相對於普通佇列,它可以在指定時間消費掉訊息。延遲佇列的應用場景 1 新使用者註冊,10分鐘後傳送郵件或站內信。2 使用者下單後,30分鐘未支付,訂單自動作廢。我們通過redis的有序集合zset來實現簡單的延遲佇列,將訊息資料序列化,作為zset的value,把訊...

php redis實現訊息佇列

參考 參考 訊息佇列 是在訊息的傳輸過程中儲存訊息的容器。訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞 如果傳送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它 應用場景 非同步處理,應用解耦,流量削鋒和訊息通訊四個場景 1 非同步處...

php redis實現訊息佇列

個人理解在專案中使用訊息佇列一般是有如下幾個原因 把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力 實現資料順序排列獲取 redis實現訊息佇列步驟如下 1 redis函式rpush,lpop 2 建議定時任務入佇列 3 建立定時任務出佇列 檔案 demo.php插入資料到redis佇列 re...