基于redis有序集合,实现简单的延时任务

基于redis有序集合,实现简单的延时任务

延时任务的场景很多,开发过程中我们经常会遇到,比如说:

1.订单未付款,5分钟后自动取消,这是电商网站非常普遍的需求;

2.用户创建订单不付款,3分钟后自动发短信、微信消息提醒;

3.会员到期提醒 等等,这些都算延时任务提醒。

 

实现延时任务功能的方式很多,我们公司的业务不大,没打算用中间件,所以,我干脆直接用redis实现。

redis实现延时任务有2种方式,一种是根据有序集合去实现,还有种是根据键的过期,去触发延时任务,两个方式都可以,今天我主要说的是第一种。因为我用的是yii2,所以代码我用的yii2写。

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。我们这边分数就是我们的时间,我们根据score的大小去处理业务。

一:添加redis延时任务

/*** 添加延时任务 * @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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfyjx.html