掌桥专利:专业的专利平台
掌桥专利
首页

延时任务处理方法、装置、电子设备及存储介质

文献发布时间:2023-06-19 18:37:28


延时任务处理方法、装置、电子设备及存储介质

技术领域

本申请涉及系统开发技术领域,特别涉及一种延时任务处理方法、装置、电子设备及存储介质。

背景技术

在系统开发过程中往往会遇到一些任务不需要马上处理,而是需要在一定时间之后执行,这种任务称之为延时任务。延时任务相对于定时任务有如下三点区别:1、定时任务有明确的触发时间,延时任务没有;2、定时任务有执行周期,而延时任务在某事件触发后一段事件内执行,没有执行周期;3、定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务。延迟任务的使用场景有以下这些:红包24h未被查收,需要延迟执行退还业务;生成订单60s后给用户发短信;订单下单之后30min后用户如果没有付钱,系统需要自动取消订单等等,这些事件都需要使用延迟任务。

相关技术中基于Redis(Remote Dictionary Server,远程字典服务)高并发延迟任务处理的方法,但是此种方法在延时任务到期时即Redis的key大量过期,大批量延时任务同时执行会导致CPU(central processing unit,中央处理器)和内存大量占用,并且有可能会有部分延时任务无法及时处理。

发明内容

本申请提供一种延时任务处理方法、装置、电子设备及存储介质,以解决相关技术中大批量延时任务同时执行导致系统CPU和内存大量占用,无法及时处理延时任务等问题。

本申请第一方面实施例提供一种延时任务处理方法,包括以下步骤:获取一个或多个延时任务;识别每个延时任务的任务标志,根据所述任务标志匹配对应延时任务的任务延迟时间,根据所述每个延时任务的业务ID和任务标志生成key,将所述key添加到Redis中,并根据所述任务延迟时间设置所述key的过期时间;监听所述Redis中已经过期的key,识别所述已经过期的key的业务ID和任务标志,根据所述任务标志匹配对应延时任务的任务实现类,并对所述任务实现类进行实例化,得到任务实例,将所述业务ID传入所述任务实例的延时任务接口,以执行对应延时任务。

根据上述技术手段,本申请实施例可以通过延时任务的任务标志匹配对应的任务延迟时间,根据任务延迟时间设置key的过期时间,监听Redis中已经过期的key,对其任务实现类进行实例化,使用接口实现灵活适配不同延迟任务,保证了能够及时处理延迟任务,避免同时执行造成的CPU和内存占用。

可选地,根据所述任务标志匹配对应延时任务的任务延迟时间和任务实现类,包括:以任务标志为索引,查询预先建立的延时任务配置表,得到所述延时任务的任务延迟时间和任务实现类。

根据上述技术手段,本申请实施例可以根据延迟任务的任务标志在延时任务配置表中匹配对应的任务延迟时间和任务实现类,方便后续进行延迟业务的处理。

可选地,在根据所述任务标志匹配对应延时任务的任务延迟时间和任务实现类之前,还包括:在数据库中创建延时任务配置表,其中,所述延时任务配置表的字段包括任务标志字段、任务实现类字段和任务延迟时间字段;获取已经实现的延时任务,将所述已经实现的延时任务添加至所述延时任务配置表中。

根据上述技术手段,本申请实施例可以通过在数据库中建立延时任务配置表,便于对各种和延迟任务相关的数据进行管理和使用。

可选地,在执行对应延时任务之后,还包括:识别所述延时任务是否执行成功;若执行成功,则将所述延时任务添加到所述延时任务配置表,否则删除所述延时任务。

根据上述技术手段,本申请实施例在执行延时任务成功后需要将延时任务添加到延时任务配置表,如果未成功,则删除延时任务,避免资源占用。

可选地,所述根据所述每个延时任务的业务ID和任务标志生成key,包括:将所述业务ID和所述任务标志通过预设分割标识进行连接,得到所述key。

根据上述技术手段,本申请实施例通过分割标识连接业务ID和任务标志共同组成需要系统监听的key。

可选地,所述根据所述任务延迟时间设置所述key的过期时间,包括:通过随机数获取预设范围内的随机时间;根据所述任务延迟时间和所述随机时间生成所述过期时间。

根据上述技术手段,本申请实施例在任务延迟时间的基础上上加上随机数范围内的随机时间生成过期时间,避免在出现大量请求时,大量延时任务同时到期加大Redis和系统服务的压力,可以均衡服务压力,提高服务能力。

可选地,所述将所述业务ID传入所述任务实例的延时任务接口,以执行对应延时任务,包括:将所述业务ID传入中预先定义的run方法,利用所述run方法执行对应延时任务。

根据上述技术手段,本申请实施例可以通过在延时任务接口中自定义run方法,实现不同业务的延时任务的执行。

本申请第二方面实施例提供一种延时任务处理装置,包括:获取模块,用于获取一个或多个延时任务;设置模块,用于识别每个延时任务的任务标志,根据所述任务标志匹配对应延时任务的任务延迟时间,根据所述每个延时任务的业务ID和任务标志生成key,将所述key添加到Redis中,并根据所述任务延迟时间设置所述key的过期时间;匹配模块,用于监听所述Redis中已经过期的key,识别所述已经过期的key的业务ID和任务标志,根据所述任务标志匹配对应延时任务的任务实现类,并对所述任务实现类进行实例化,得到任务实例,将所述业务ID传入所述任务实例的延时任务接口,以执行对应延时任务。

本申请第三方面实施例提供一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序,以实现如上述实施例所述的延时任务处理方法。

本申请第四方面实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行,以用于实现如上述实施例所述的延时任务处理方法。

由此,本申请至少具有如下有益效果:

(1)可以通过延时任务的任务标志匹配对应的任务延迟时间,根据任务延迟时间设置key的过期时间,监听Redis中已经过期的key,对其任务实现类进行实例化,使用接口实现灵活适配不同延迟任务,保证了能够及时处理延迟任务,避免同时执行造成的CPU和内存占用

(2)可以根据延迟任务的任务标志在延时任务配置表中匹配对应的任务延迟时间和任务实现类,方便后续进行延迟业务的处理。

(3)可以通过在数据库中建立延时任务配置表,便于对各种和延迟任务相关的数据进行管理和使用。

(4)在执行延时任务成功后需要将延时任务添加到延时任务配置表,如果未成功,则删除延时任务,避免资源占用。

(5)通过分割标识连接业务ID和任务标志共同组成需要系统监听的key。

(6)在任务延迟时间的基础上上加上随机数范围内的随机时间生成过期时间,避免在出现大量请求时,大量延时任务同时到期加大Redis和系统服务的压力,可以均衡服务压力,提高服务能力。

(7)可以通过在延时任务接口中自定义run方法,实现不同业务的延时任务的执行。

本申请附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本申请的实践了解到。

附图说明

本申请上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1为根据本申请实施例提供的一种延时任务处理方法的流程图;

图2为根据本申请实施例提供的延时任务处理方法的系统设计图;

图3为根据本申请一个实施例提供的延时任务处理方法的流程图;

图4为根据本申请实施例提供的延时任务处理装置的示例图;

图5为根据本申请实施例提供的电子设备的结构示意图。

具体实施方式

下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本申请,而不能理解为对本申请的限制。

相关技术中使用基于Redis的有序集合ZSet的特性,将延时任务信息存储到ZSet集合中,通过定时任务监听过期的Key来处理延迟任务,这是比较常规的利用Redis高性能key-value存取特性和ZSet天然排序能力的实现方式。这个方式当遇到抢票类场景,同一时间大量提交订单创建了延时任务,在延时任务到期时即Redis的key大量过期,大批量延时任务同时执行会导致系统CPU和内存大量占用,并且可能会有部分延时任务无法及时处理。此外该方法没有针对系统中多种业务的不同延时任务需要提出相应的解决方法。

下面参考附图描述本申请实施例的延时任务处理方法、装置、电子设备及存储介质。针对上述背景技术中提到的在延时任务到期即Redis的key大量过期,大批量延时任务同时执行会导致系统CPU和内存大量占用,并且可能会有部分延时任务无法及时处理的问题,本申请提供了一种延时任务处理方法,在该方法中,基于Redis高性能key-value数据库,利用key过期机制,通过表配置数据管理各种任务及其延时时间,使用接口实现灵活适配不同延时任务的特性。由此,解决了相关技术中大批量延时任务同时执行导致系统CPU和内存大量占用,无法及时处理延时任务等问题。

具体而言,图1为本申请实施例所提供的一种延时任务处理方法的流程示意图。

如图1所示,该延时任务处理方法包括以下步骤:

在步骤S101中,获取一个或多个延时任务。

其中,延时任务的使用场景可以包括:红包24小时未被查收,需要延迟执退还业务;生成订单60秒后给用户发短信;订单下单之后30分钟后用户如果没有付钱,系统需要自动取消订单等。

在步骤S102中,识别每个延时任务的任务标志,根据任务标志匹配对应延时任务的任务延迟时间,根据每个延时任务的业务ID和任务标志生成key,将key添加到Redis中,并根据任务延迟时间设置key的过期时间。

可以理解是,本申请实施例可以通过延时任务的任务标志匹配对应的任务延迟时间,根据延时任务的业务ID和任务标志生成key,将key添加到Redis中,根据延迟时间设置key的过期时间。

在本申请实施例中,在根据任务标志匹配对应延时任务的任务延迟时间和任务实现类之前,还包括:在数据库中创建延时任务配置表,其中,延时任务配置表的字段包括任务标志字段、任务实现类字段和任务延迟时间字段;获取已经实现的延时任务,将已经实现的延时任务添加至延时任务配置表中。

其中,延时任务配置表主要字段包括任务标志taskKey、任务实现类taskClass和任务延迟时间delayTime。

其中,在数据库中创建延时任务配置表delay_task_config的代码如下:

CREATE TABLE delay_task_config(

‘id’bigint(0)NOT NULL,

‘task_key’varchar(100)NOT NULL COMMent‘任务标志’,

‘task_class’varchar(200)NOT NULLCOMMENT‘任务实现类’,

‘delay_time’int(100)NOT NULL COMMENT‘延迟时间(单位默认为:秒)’,

‘status’tinyint(10)NOT NULL DEFAULT COMMENT‘任务状态:0有效,1无效’,

PRIMARY KEY(`id`)USING BTREE

)ENGINE=InnoDB CHARACTER SET=utf8mb4 COMMENT='延时任务配置'。

在本申请实施例中,根据任务标志匹配对应延时任务的任务延迟时间和任务实现类,包括:以任务标志为索引,查询预先建立的延时任务配置表,得到延时任务的任务延迟时间和任务实现类。

可以理解的是,本申请实施例可以以任务标志taskKey为索引查询延时任务配置表获取到对应任务的延时时间和任务实现类。

在本申请实施例中,根据每个延时任务的业务ID和任务标志生成key,包括:将业务ID和任务标志通过预设分割标识进行连接,得到key。

其中,预设分割表示用于将业务ID和任务标识连接,可以设置为#,对此不做限定。

可以理解的是,本申请实施例可以根据延时任务的业务ID和任务标志taskKey通过#连接共同组成需要系统监听的过期key,将ID#taskKey添加到Redis中。

在本申请实施例中,根据任务延迟时间设置key的过期时间,包括:通过随机数获取预设范围内的随机时间;根据任务延迟时间和随机时间生成过期时间。

其中,本申请实施例在根据任务标志taskKey查询延时任务配置表获取到对应任务的延迟时间,再通过随机数获取一个合理范围内的随机时间共同组成该延时任务的过期时间。

在步骤S103中,监听Redis中已经过期的key,识别已经过期的key的业务ID和任务标志,根据任务标志匹配对应延时任务的任务实现类,并对任务实现类进行实例化,得到任务实例,将业务ID传入任务实例的延时任务接口,以执行对应延时任务。

可以理解的是,本申请实施例系统监听Redis中的已经过期的key,将key通过#分隔可以获取到业务ID和延时任务标志taskKey,根据延时任务标志taskKey查询延时任务配置表获取到延时任务具体实现类taskClass,将该实现类实例化,将业务ID传入执行该延时任务实例的延时任务接口完成延时任务执行。

其中,延时任务接口包括一个run方法,用于执行对应延迟任务,具体代码如下:

InterfaceDelayTask{

void run(String id);

}

在本申请实施例中,将业务ID传入任务实例的延时任务接口,以执行对应延时任务,包括:将业务ID传入中预先定义的run方法,利用run方法执行对应延时任务。

在本申请实施例中,在执行对应延时任务之后,还包括:识别延时任务是否执行成功;若执行成功,则将延时任务添加到延时任务配置表,否则删除延时任务。

举例而言,以在订单业务的场景下为例,订单业务实现延时删除未支付订单功能,根据业务ID(这里为订单ID)查询订单状态信息,判断是否已经支付成功,未成功则关闭订单,将已经支付成功的订单任务添加到延时任务配置表中。

具体而言,上述实施例所述的延时任务处理方法的系统设计图如图2所示,包括业务系统、数据库和Redis服务。其中,数据库用来存储延时任务配置表的信息;业务系统用于将业务处理提交延时任务key到Redis;业务系统监听Redis中过期的key,针对过期的key处理后实例化出延时任务执行延时任务。

下面将通过一个具体实施例来阐述延时任务处理方法,如图3所示,步骤如下:

1、自定义延时任务接口,接口中定义一个run方法,需要传入业务id参数,在数据库创建延时任务配置表,主要字段有taskKey延时任务标志、taskClass延时任务实现类、delayTime任务延迟时间。其中,通用延迟接口和延迟任务配置表的代码在上述实施例中已经阐述,此处不再赘述。

2、业务需求实现自定义延时任务功能,例如订单业务实现延时删除未支付订单功能,根据业务id(这里为订单id)查询订单状态信息,判断是否已经支付成功,未成功则关闭订单。

3、添加未支付订单过期删除延时任务

Insertinto delay_task_config values(UUID_SHORT(),'closeOrder','xx.xx.DelayCloseOrderTask',1800);

4、在相关业务中提交延时任务,延迟时间需要在配置的时间基础上增加随机时间,本例中订单在30分钟后未支付关闭,创建延时任务时,在30分钟的延时基础上加上60以内的随机数,此处目的是避免在大量请求创建订单,大量延时任务同时到期加大Redis和系统服务的压力,该设计可以均衡服务压力,提高服务能力。

5、监听Redis中过期的key,处理过期的key获取到业务id和延时任务标识taskKey,通过查询数据库可获取到延时任务实现类,将延时任务实例化执行run方法,此延时任务完成执行。

综上,本申请实施例中未支付订单延时删除任务设计可在抢购等大流量场景下,将延时任务分布在一个范围内,尽可能让系统在单位时间内处理的延时任务数量更均衡,提高了系统可靠性和处理能力。此外在其他业务场景中需要延时任务时,只需要实现DelayTask接口,完成延时任务功能,在数据库延时任务配置表delay_task_config中添加相应的配置即可轻松扩展,同时可灵活控制配置数据的状态即可控制相关业务的延时任务是否提交与执行。

根据本申请实施例提出的延时任务处理方法,可以通过延时任务的任务标志匹配对应的任务延迟时间,根据任务延迟时间设置key的过期时间,监听Redis中已经过期的key,对其任务实现类进行实例化,使用接口实现灵活适配不同延迟任务,保证了能够及时处理延迟任务,避免同时执行造成的CPU和内存占用;可以根据延迟任务的任务标志在延时任务配置表中匹配对应的任务延迟时间和任务实现类,方便后续进行延迟业务的处理;可以通过在数据库中建立延时任务配置表,便于对各种和延迟任务相关的数据进行管理和使用;在执行延时任务成功后需要将延时任务添加到延时任务配置表,如果未成功,则删除延时任务,避免资源占用;通过分割标识连接业务ID和任务标志共同组成需要系统监听的key;在任务延迟时间的基础上上加上随机数范围内的随机时间生成过期时间,避免在出现大量请求时,大量延时任务同时到期加大Redis和系统服务的压力,可以均衡服务压力,提高服务能力;可以通过在延时任务接口中自定义run方法,实现不同业务的延时任务的执行。

其次参照附图描述根据本申请实施例提出的延时任务处理装置。

图4是本申请实施例的延时任务处理装置的方框示意图。

如图4所示,该延时任务处理装置10包括:获取模块100、设置模块200和执行模块300。

其中,获取模块100用于获取一个或多个延时任务;设置模块200用于识别每个延时任务的任务标志,根据任务标志匹配对应延时任务的任务延迟时间,根据每个延时任务的业务ID和任务标志生成key,将key添加到Redis中,并根据任务延迟时间设置key的过期时间;执行模块300用于监听Redis中已经过期的key,识别已经过期的key的业务ID和任务标志,根据任务标志匹配对应延时任务的任务实现类,并对任务实现类进行实例化,得到任务实例,将业务ID传入任务实例的延时任务接口,以执行对应延时任务。

需要说明的是,前述对延时任务处理方法实施例的解释说明也适用于该实施例的延时任务处理装置,此处不再赘述。

根据本申请实施例提出的延时任务处理装置,可以通过延时任务的任务标志匹配对应的任务延迟时间,根据任务延迟时间设置key的过期时间,监听Redis中已经过期的key,对其任务实现类进行实例化,使用接口实现灵活适配不同延迟任务,保证了能够及时处理延迟任务,避免同时执行造成的CPU和内存占用;可以根据延迟任务的任务标志在延时任务配置表中匹配对应的任务延迟时间和任务实现类,方便后续进行延迟业务的处理;可以通过在数据库中建立延时任务配置表,便于对各种和延迟任务相关的数据进行管理和使用;在执行延时任务成功后需要将延时任务添加到延时任务配置表,如果未成功,则删除延时任务,避免资源占用;通过分割标识连接业务ID和任务标志共同组成需要系统监听的key;在任务延迟时间的基础上上加上随机数范围内的随机时间生成过期时间,避免在出现大量请求时,大量延时任务同时到期加大Redis和系统服务的压力,可以均衡服务压力,提高服务能力;可以通过在延时任务接口中自定义run方法,实现不同业务的延时任务的执行。

图5为本申请实施例提供的电子设备的结构示意图。该电子设备可以包括:

存储器501、处理器502及存储在存储器501上并可在处理器502上运行的计算机程序。

处理器502执行程序时实现上述实施例中提供的延时任务处理方法。

进一步地,电子设备还包括:

通信接口503,用于存储器501和处理器502之间的通信。

存储器501,用于存放可在处理器502上运行的计算机程序。

存储器501可能包含高速RAM(Random Access Memory,随机存取存储器)存储器,也可能还包括非易失性存储器,例如至少一个磁盘存储器。

如果存储器501、处理器502和通信接口503独立实现,则通信接口503、存储器501和处理器502可以通过总线相互连接并完成相互间的通信。总线可以是ISA(IndustryStandard Architecture,工业标准体系结构)总线、PCI(Peripheral Component,外部设备互连)总线或EISA(Extended Industry Standard Architecture,扩展工业标准体系结构)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。

可选的,在具体实现上,如果存储器501、处理器502及通信接口503,集成在一块芯片上实现,则存储器501、处理器502及通信接口503可以通过内部接口完成相互间的通信。

处理器502可能是一个CPU(Central Processing Unit,中央处理器),或者是ASIC(Application Specific Integrated Circuit,特定集成电路),或者是被配置成实施本申请实施例的一个或多个集成电路。

本申请实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上的延时任务处理方法。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不是必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或N个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。

此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本申请的描述中,“N个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更N个用于实现定制逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。

应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,N个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。如,如果用硬件来实现和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列,现场可编程门阵列等。

本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。

尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。

技术分类

06120115637706