基於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...