基于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
Copy

二:获取任务条数 我们可以做个定时任务,去定时获取需要消费的延时任务,当有任务才继续执行

/**获取剩余任务数
* @param $setName
* @return int
*/
public static function count($setName){
$redisModel = Yii::$app->redis;
return $redisModel->zcard($setName);
}
PHP
Copy

三:消费延时任务 这边是获取延时任务代码,具体怎么去进一步抄作,可以根据业务需要去写。

/**
* 消费延时任务
*/
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);
}

基于redis有序集合,实现简单的延时任务的更多相关文章

  1. Redis 有序集合(sorted set)

    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序 ...

  2. redis 有序集合(zset)函数

    redis 有序集合(zset)函数 zAdd 命令/方法/函数 Adds the specified member with a given score to the sorted set stor ...

  3. Redis有序集合

    Redis有序集合类似Redis集合存储在设定值唯一性.不同的是,一个有序集合的每个成员带有分数,用于以便采取有序set命令,从最小的到最大的分数有关. Redis 有序set添加,删除和测试中的O( ...

  4. Redis 有序集合(sorted set),发布订阅,事务,脚本,连接,服务器(三)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  5. redis有序集合的使用

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  6. redis有序集合数据类型---sortedset

    一.概述 redis有序集合和集合一样,也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数. redis正式通过分数来为集合中的重圆进行从小到大的 ...

  7. 数据结构与算法简记--redis有序集合实现-跳跃表

    跳表 定义 为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层.如下图所示,其中down表示down指针,指向下一级节点.以此类推,对于节点数为n ...

  8. redis(十四):Redis 有序集合(sorted set)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  9. 《闲扯Redis十一》Redis 有序集合对象底层实现

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

随机推荐

  1. 解析PHP跳出循环的方法以及continue、break、exit的区别介绍

    本篇文章是对PHP跳出循环的方法以及continue.break.exit的区别进行了详细的分析介绍,需要的朋友参考下   PHP中的循环结构大致有for循环,while循环,do{} while 循 ...

  2. The 10th Shandong Provincial Collegiate Programming Contest H.Tokens on the Segments(贪心+优先级队列 or 贪心+暴力)

    传送门 •题意 二维平面上有 n 条线段,每条线段坐标为 $(l_i,i),(r_i,i)$: 平面上的每个整点坐标上都可以放置一枚硬币,但是要求任意两枚硬币的横坐标不相同: 问最多有多少条线段可以放 ...

  3. H3C 因特网域名结构树

  4. SmartAssembly 使用方法

    SmartAssembly加壳工具,我还真的是不太喜欢给自己的程序加壳,觉得开源才是王道,但是没办法工作需要,需要有个加壳后与加壳前的对比,好吧谁叫咱只是程序员呢. 开始埋头苦干,找了半天也没找到合适 ...

  5. 企业级Docker私有仓库Harbor

    一.Harbor简介 1.Harbor介绍 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docke ...

  6. git push报错大文件,删除后重新commit依然报错

    git push报错: github不能上传大文件,按道理删掉重新提交就行了 可是删掉后,git add -A,再git commit,再git push,依然报错 后来我想明白了 github上传时 ...

  7. STM32与STM8操作寄存器的区别

    在STM8中,由于STM8寄存器较少,在头文件中定义寄存器的时候不用采取任何形式的封装,所以操作寄存器的时候直接可以用如下方式处理:PB_DDR |=0x20; 但是在STM32中,由于其寄存器实在太 ...

  8. Java 从入门到进阶之路(十九)

    在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...

  9. 页面显示jsp源码问题

    问题错误在于WEB.XML 将/*改为*即可

  10. ELK学习实验004:Elasticsearch的简单介绍和操作

    一 集群节点 Elstaicsearch的集群是由多个节点组成都,通过cluster.name设置集权名称,比能切用与区分其他的集群,每个节点通过node.name指定节点 在Elasticsearc ...