基于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); }
相关文章
相关标签/搜索