基於redis有序集合,實現簡單的延時任務

基於redis有序集合,實現簡單的延時任務

延時任務的場景不少,開發過程當中咱們常常會遇到,好比說:php

1.訂單未付款,5分鐘後自動取消,這是電商網站很是廣泛的需求;redis

2.用戶建立訂單不付款,3分鐘後自動發短信、微信消息提醒;json

3.會員到期提醒 等等,這些都算延時任務提醒。微信

 

實現延時任務功能的方式不少,咱們公司的業務不大,沒打算用中間件,因此,我乾脆直接用redis實現。yii2

redis實現延時任務有2種方式,一種是根據有序集合去實現,還有種是根據鍵的過時,去觸發延時任務,兩個方式均可以,今天我主要說的是第一種。由於我用的是yii2,因此代碼我用的yii2寫。併發

Redis 有序集合和集合同樣也是string類型元素的集合,且不容許重複的成員。不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。有序集合的成員是惟一的,但分數(score)卻能夠重複。咱們這邊分數就是咱們的時間,咱們根據score的大小去處理業務。app

一:添加redis延時任務yii

/*** 添加延時任務 * @param $setName集合名字 *@param $time 啓動任務的時間 * @param array $task 任務詳情 * @return mixed */ public static function product($setName,$time, $task){ $redisModel = Yii::$app->redis; if(is_array($task)){ $task = json_encode($task,JSON_UNESCAPED_UNICODE); } //延時2秒,避免結束時間和到點時間出現併發問題 return $redisModel->zadd($setName,$time+2,$task); }
PHP
Copy

二:獲取任務條數 咱們能夠作個定時任務,去定時獲取須要消費的延時任務,當有任務才繼續執行網站

/**獲取剩餘任務數 * @param $setName * @return int */ public static function count($setName){ $redisModel = Yii::$app->redis; return $redisModel->zcard($setName); }
PHP
Copy

三:消費延時任務 這邊是獲取延時任務代碼,具體怎麼去進一步抄做,能夠根據業務須要去寫。spa

/** * 消費延時任務 */ public static function consume($setName){ $redisModel = Yii::$app->redis; return $redisModel->zrangebyscore($setName,0,time()); }
PHP
Copy

四:刪除任務 任務處理完畢,刪除集合中已經處理好的任務

/**刪除任務 * @param $setName * @param $value * @return mixed */ public static function delTask($setName,$value) { $redisModel = Yii::$app->redis; return $redisModel->zrem($setName, $value); }
相關文章
相關標籤/搜索