一种基于Redis实现高性能延时队列方法技术

技术编号:38992480 阅读:11 留言:0更新日期:2023-10-07 10:22
本发明专利技术提供了一种基于Redis实现高性能延时队列方法,包括:S1、利用redis的zset结构将任务的执行时间作为score,要执行的任务数据作为value,存放在zset中;S2、为每个任务key创建相同数量的轮询线程,定时查询zset的score分数最小的元素;S3、轮询线程查询出任务后,将该任务写入到消息队列中。有益效果:提供了一种Redis实现高性能延时队列的方法,特别适用于活动结束前一定时间给用户推送消息、优惠券过期前一定时间给用户推送消息、秒杀时下单后一定时间内未付款就自动取消订单等场景,同时本方案中延时任务是保存在redis里面的,redis具有数据持久化的机制,可以有效的避免延时任务数据的丢失,另外,redis还可以通过哨兵模式、集群模式有效的避免单点故障造成的服务中断。断。断。

【技术实现步骤摘要】
一种基于Redis实现高性能延时队列方法


[0001]本专利技术属于Redis领域,尤其是涉及一种基于Redis实现高性能延时队列方法。

技术介绍

[0002]对于延时任务,常见的方案就是扫描数据库表,就是用一个后台进程,每隔一段时间扫描数据库的整张数据表,判断每个任务是否达到触发的条件;有些MQ消息队列可以支持延时消息;扫描数据库表缺点是有延迟,不能再指定的时间里触发,对于时效性高的场景,这种方案是不能满足需求的;MQ消息队列存在问题:延时任务需要重新更新时间无法做到,因为消息发出去后,无法收回。

技术实现思路

[0003]有鉴于此,本专利技术旨在提出一种基于Redis实现高性能延时队列方法,以有效利用项目中经常使用的Redis缓存中间件,解决了网站会对用户推送延时任务的需要,同时使用集群模式有效的避免单点故障造成的服务中断。
[0004]为达到上述目的,本专利技术的技术方案是这样实现的:
[0005]一种基于Redis实现高性能延时队列方法,包括以下步骤:
[0006]S1、利用redis的zset结构将任务的执行时间作为score,要执行的任务数据作为value,存放在zset中;
[0007]S2、为每个任务key创建相同数量的轮询线程,定时查询zset的score分数最小的元素;
[0008]S3、轮询线程查询出任务后,将该任务写入到消息队列中。
[0009]进一步的,在步骤S1中,为每个延时任务分配一个任务key,避免一个key存储在数据量变多以后导致查询速度变慢,如果任务量增长通过扩容redis key的数量来容纳增长的数量。
[0010]进一步的,在步骤S2中,用ZRANGEBYSCORE key

inf+inf limit 0 1withscores命令来实现;如果最小的分数小于等于当前时间戳,就将该任务取出来执行,否则休眠一段时间后再查询。
[0011]进一步的,在步骤S3中,由任务处理服务进行从消息队列取消息,然后执行业务。
[0012]进一步的,如在实际的业务中,还依赖数据库写入数据则先修改数据库然后再向redis写入数据,如果redis写入失败,发送一条消息重新进行补偿处理保证数据的一致性。
[0013]进一步的,本方案公开了一种电子设备,包括处理器以及与处理器通信连接,且用于存储所述处理器可执行指令的存储器,所述处理器用于执行一种基于Redis实现高性能延时队列方法。
[0014]进一步的,本方案公开了一种服务器,包括至少一个处理器,以及与所述处理器通信连接的存储器,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,以使所述至少一个处理器执行一种基于Redis实现高性能延时队列方法。
[0015]进一步的,本方案公开了一种计算机可读取存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现一种基于Redis实现高性能延时队列方法。
[0016]相对于现有技术,本专利技术所述的一种基于Redis实现高性能延时队列方法具有以下有益效果:
[0017]本专利技术所述的一种基于Redis实现高性能延时队列方法,提供了一种Redis实现高性能延时队列的方法,特别适用于活动结束前一定时间给用户推送消息、优惠券过期前一定时间给用户推送消息、秒杀时下单后一定时间内未付款就自动取消订单等场景,同时本方案中延时任务是保存在redis里面的,redis具有数据持久化的机制,可以有效的避免延时任务数据的丢失,另外,redis还可以通过哨兵模式、集群模式有效的避免单点故障造成的服务中断。
附图说明
[0018]构成本专利技术的一部分的附图用来提供对本专利技术的进一步理解,本专利技术的示意性实施例及其说明用于解释本专利技术,并不构成对本专利技术的不当限定。在附图中:
[0019]图1为本专利技术实施例所述的一种基于Redis实现高性能延时队列方法示意图。
具体实施方式
[0020]需要说明的是,在不冲突的情况下,本专利技术中的实施例及实施例中的特征可以相互组合。
[0021]下面将参考附图并结合实施例来详细说明本专利技术。
[0022]如图1所示,本方案公开了一种基于Redis实现高性能延时队列方法,具体步骤如下:
[0023](1)步骤1、利用redis的zset结构将任务的执行时间作为score,要执行的任务数据作为value,存放在zset中;为每个延时任务分配一个任务key,避免一个key存储在数据量变多以后导致查询速度变慢,如果任务量增长,我们可以快速扩容redis key的数量来抗住增长的数量;
[0024](2)步骤2、为每个任务key创建相同数量的轮询线程,定时查询zset的score分数最小的元素,可以用ZRANGEBYSCORE key

inf+inf limit 0 1withscores命令来实现;如果最小的分数小于等于当前时间戳,就将该任务取出来执行,否则休眠一段时间后再查询;
[0025](3)步骤3、轮询线程查询出任务后,将该任务写入到消息队列中。由任务处理服务进行从消息队列取消息,然后执行业务。这样任务处理服务进行可以分布式部署,轮询线程只需做分发,这样可以把并发做到非常高,即使同一时间有大量的任务,也能很小的延时内完成任务;
[0026](4)步骤4、如在实际的业务中,还依赖数据库写入数据。先修改数据库然后再向redis写入数据,如果redis写入失败,可以发送一条消息重新进行补偿处理保证数据的一致性;
[0027]本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这
些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本专利技术的范围。
[0028]在本申请所提供的几个实施例中,应该理解到,所揭露的方法和系统,可以通过其它的方式实现。例如,以上所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。上述单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本专利技术实施例方案的目的。
[0029]最后应说明的是:以上各实施例仅用以说明本专利技术的技术方案,而非对其限制;尽管参照前述各实施例对本专利技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于Redis实现高性能延时队列方法,其特征在于,包括以下步骤:S1、利用redis的zset结构将任务的执行时间作为score,要执行的任务数据作为value,存放在zset中;S2、为每个任务key创建相同数量的轮询线程,定时查询zset的score分数最小的元素;S3、轮询线程查询出任务后,将该任务写入到消息队列中。2.根据权利要求1所述的一种基于Redis实现高性能延时队列方法,其特征在于,在步骤S1中,为每个延时任务分配一个任务key,避免一个key存储在数据量变多以后导致查询速度变慢,如果任务量增长通过扩容redis key的数量来容纳增长的数量。3.根据权利要求1所述的一种基于Redis实现高性能延时队列方法,其特征在于,在步骤S2中,用ZRANGEBYSCORE key

inf+inf limit 0 1withscores命令来实现;如果最小的分数小于等于当前时间戳,就将该任务取出来执行,否则休眠一段时间后再查询。4.根据权利要求1所述的一种基于Redis实现高性能延时队列方法,其特征在于,在步骤S3中,由...

【专利技术属性】
技术研发人员:王鹏凯
申请(专利权)人:紫光云技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1