一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

任务处理前等待时间的确定方法及装置与流程

2022-02-19 22:36:22 来源:中国专利 TAG:


1.本公开涉及实时任务处理领域,尤其涉及一种任务处理前等待时间的确定方法及装置。


背景技术:

2.在实时任务处理系统中,常常对大量待执行的任务设置若干个优先级,在按优先级执行的过程中,需要实时获取某个任务的等待时间(即还需要等待多久才能开始执行)。一般来说,每个任务的执行时间约为1分钟,因此需要知道优先级排在该任务的优先级前面的任务总数,才能求出对应的等待时间。
3.目前,以任务列表的方式存储每个优先级对应的任务的数量,但是由于任务的数量会随时变化,如新增一个优先级为6的任务时,那么,排在6后面的每个优先级,其前面所有优先级的任务总数,也即前缀和s[6],s[7],s[8],...,s[n]都需要重新计算;同理,当删除一个优先级为6的任务,也需要重新计算s[x](6<=x<=n)的所有元素,上述算法复杂度是线性的,也就是线性级别的时间复杂度o(n),因为n>=10000,可见相关技术中获取前缀和的方式是个比较耗时的操作,无法应用到生产环境中。


技术实现要素:

[0004]
本公开提供一种任务处理前等待时间的确定方法及装置,以至少解决相关技术中获取前缀和的方式时间成本大的问题。
[0005]
根据本公开实施例的第一方面,提供一种任务处理前等待时间的确定方法,包括:确定任务列表中的预定任务的优先级;确定预定任务的优先级在服务器中所属的当前优先级分支,其中,服务器中以树状数组的形式存储任务列表对应的所有优先级;获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级,其中,预定优先级分支上除父节点的优先级以外的所有节点的优先级均小于当前优先级分支上节点的优先级;通过将预定优先级分支上的最大优先级的节点对应的任务数求和,获取任务列表中处理顺序在预定任务之前的任务总数;基于任务总数,确定预定任务处理前的等待时间。
[0006]
可选地,在获取任务列表中处理顺序在预定任务之前的任务总数之后,还包括:确定预定任务的优先级对应的任务的数量变化预定个数;获取当前优先级分支上大于预定任务的优先级的目标优先级;将预定任务的优先级和目标优先级中每个优先级的节点对应的任务数替换为对应的预定值,其中,对应的预定值是基于预定任务的优先级和目标优先级的节点对应的任务数分别和预定个数得到的。
[0007]
可选地,在服务器为redis服务器的情况下,获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级之后,还包括:在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数。
[0008]
可选地,在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数,包括:通过bitmap的bitfield命令,在redis服务器中每个最大优先级对
应的比特位处,获取最大优先级的节点对应的任务数。
[0009]
可选地,在服务器为redis服务器的情况下,将预定任务的优先级和目标优先级中每个优先级的节点对应的任务数替换为对应的预定值,包括:在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值。
[0010]
可选地,在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值,包括:通过bitmap的incrby命令,在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值。
[0011]
可选地,通过将预定优先级分支上的最大优先级的节点对应的任务数求和,获取任务列表中处理顺序在预定任务之前的任务总数,包括:将预定优先级分支上的最大优先级的节点对应的任务数求和,得到任务列表中优先级高于预定任务的优先级且处理顺序在预定任务前的第一任务总数;获取任务列表中与预定任务属于同一优先级且处理顺序在预定任务前的第二任务总数;将第一任务总数和第二任务总数求和,得到任务列表中处理顺序在预定任务前的任务总数。
[0012]
根据本公开实施例的第二方面,提供一种任务处理前等待时间的确定装置,包括:优先级确定单元,被配置为确定任务列表中的预定任务的优先级;分支确定单元,被配置为确定预定任务的优先级在服务器中所属的当前优先级分支,其中,服务器中以树状数组的形式存储任务列表对应的所有优先级;最大优先级获取单元,被配置为获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级,其中,预定优先级分支上除父节点的优先级以外的所有节点的优先级均小于当前优先级分支上节点的优先级;任务总数获取单元,被配置为通过将预定优先级分支上的最大优先级的节点对应的任务数求和,获取任务列表中处理顺序在预定任务之前的任务总数;等待时间确定单元,被配置为基于任务总数,确定预定任务处理前的等待时间。
[0013]
可选地,任务总数获取单元,还被配置为在获取任务列表中处理顺序在预定任务之前的任务总数之后,确定预定任务的优先级对应的任务的数量变化预定个数;获取当前优先级分支上大于预定任务的优先级的目标优先级;将预定任务的优先级和目标优先级中每个优先级的节点对应的任务数替换为对应的预定值,其中,对应的预定值是基于预定任务的优先级和目标优先级的节点对应的任务数分别和预定个数得到的。
[0014]
可选地,在服务器为redis服务器的情况下,最大优先级获取单元,还被配置为获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级之后,在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数。
[0015]
可选地,最大优先级获取单元,还被配置为通过bitmap的bitfield命令,在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数。
[0016]
可选地,在服务器为redis服务器的情况下,任务总数获取单元,还被配置为在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值。
[0017]
可选地,任务总数获取单元,还被配置为通过bitmap的incrby命令,在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值。
[0018]
可选地,上述任务总数获取单元,还被配置为将预定优先级分支上的最大优先级的节点对应的任务数求和,得到任务列表中优先级高于预定任务的优先级且处理顺序在预定任务前的第一任务总数;获取任务列表中与预定任务属于同一优先级且处理顺序在预定任务前的第二任务总数;将第一任务总数和第二任务总数求和,得到任务列表中处理顺序在预定任务前的任务总数。
[0019]
根据本公开实施例的第五方面,提供了一种电子设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,处理器被配置为执行指令,以实现根据本公开的任务处理前等待时间的确定方法。
[0020]
根据本公开实施例的第六方面,提供了一种计算机可读存储介质,当计算机可读存储介质中的指令被至少一个处理器运行时,促使至少一个处理器执行如上根据本公开的任务处理前等待时间的确定方法。
[0021]
根据本公开实施例的第七方面,提供了一种计算机程序产品,包括计算机指令,计算机指令被处理器执行时实现根据本公开的任务处理前等待时间的确定方法。
[0022]
本公开的实施例提供的技术方案至少带来以下有益效果:
[0023]
根据本公开的任务处理前等待时间的确定方法及装置,将任务列表中每个优先级对应的任务的数量以树状数组的方式存储在redis服务器中,即在每次获取前缀和时,可以根据预定任务的优先级,快速从redis服务器中获取相应的优先级,进而计算预定任务前的任务总数,也即前缀和,进而得到预定任务还有多少时间开始处理,方便用户基于该等待时间合理的安排自己的时间,通过本公开可以大大减少了运算量,降低了cpu的负载,提高了系统的响应速度和吞吐量,同时,保证了整个过程的原子化,避免了并发环境下数据冲突/资源竞争的问题。因此,本公开解决了相关技术中获取前缀和的方式时间成本大的问题。
[0024]
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
[0025]
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
[0026]
图1是示出根据本公开的示例性实施例的任务处理前等待时间的确定方法的实施场景示意图;
[0027]
图2是根据一示例性实施例示出的一种任务处理前等待时间的确定方法的流程图;
[0028]
图3是根据一示例性实施例示出的树状数组的结构图;
[0029]
图4是根据一示例性实施例示出的一种任务处理前等待时间的确定装置的框图;
[0030]
图5是根据本公开实施例的一种电子设备500的框图。
具体实施方式
[0031]
为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
[0032]
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第
二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
[0033]
在此需要说明的是,在本公开中出现的“若干项之中的至少一项”均表示包含“该若干项中的任意一项”、“该若干项中的任意多项的组合”、“该若干项的全体”这三类并列的情况。例如“包括a和b之中的至少一个”即包括如下三种并列的情况:(1)包括a;(2)包括b;(3)包括a和b。又例如“执行步骤一和步骤二之中的至少一个”,即表示如下三种并列的情况:(1)执行步骤一;(2)执行步骤二;(3)执行步骤一和步骤二。
[0034]
针对上述问题,本公开提供了一种任务处理前等待时间的确定方法,能够减少运算量,降低cpu的负载以及提高系统的响应速度和吞吐量,下面以实时任务处理系统为例进行说明。
[0035]
图1是示出根据本公开的示例性实施例的任务处理前等待时间的确定方法的实施场景示意图,如图1所述,该实施场景包括服务器100、用户终端110和用户终端120,其中,用户终端不限于2个,包括并不限于手机、个人计算机等设备,用户终端可以安装实时任务处理系统,服务器可以是一个服务器,也可以是若干个服务器组成服务器集群,还可以是云计算平台或虚拟化中心。
[0036]
用户终端110、120接收用户的指示,基于用户的指示确定需要计算等待时间的预定任务,并将该预定任务发送给服务器100,服务器100基于接收到的预定任务,确定该预定任务的优先级并确定预定任务的优先级在服务器中所属的当前优先级分支,其中,服务器100中以树状数组的形式存储任务列表对应的所有优先级;在确定当前优先级分支后,服务器100获取与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级,其中,预定优先级分支上除父节点的优先级以外的所有节点的优先级均小于当前优先级分支上节点的优先级;服务器100通过将预定优先级分支上的最大优先级的节点对应的任务数求和,获取任务列表中处理顺序在预定任务之前的任务总数;再基于任务总数,确定预定任务处理前的等待时间。
[0037]
下面,将参照图2至图4详细描述根据本公开的示例性实施例的任务处理前等待时间的确定方法及装置。
[0038]
图2是根据一示例性实施例示出的一种任务处理前等待时间的确定方法的流程图,如图2所示,该方法包括以下步骤:
[0039]
在步骤s201中,确定任务列表中的预定任务的优先级。任务列表是包含了所有任务的列表,从该任务列表中可以获取任一任务。预定任务是用户需要确定其等待时间的任务,等待时间即还需要等待多久预定任务才能开始执行。
[0040]
在步骤s202中,确定预定任务的优先级在服务器中所属的当前优先级分支,其中,服务器中以树状数组的形式存储任务列表对应的所有优先级。例如,上述树状数组是一种支持单点/区间修改和单点/区间查询的高级数据结构,查询和修改操作可以在对数级的时间复杂度内完成,也是一种特殊的二进制相关的数据组织方式,其结构如图3所示,假设用c来表示树状数组,该结构中每个节点为c[1]、c[2]、c[3]、c[4]、c[5]、c[6]、c[7]和c[8],数
组里的每个元素的值不是简单代表每个优先级的任务数量,而是包含了对应优先级前面的某些元素的值,假设a[i]代表优先级为i的任务的数量,每个节点具体的含义如下:c[1]=a[1],c[2]=a[1] a[2],c[3]=a[3],c[4]=a[1] a[2] a[3] a[4],c[5]=a[5],c[6]=a[5] a[6],c[7]=a[7],c[8]=a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]。
[0041]
在步骤s203中,获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级,其中,预定优先级分支上除父节点的优先级以外的所有节点的优先级均小于当前优先级分支上节点的优先级。例如,可以通过如下方式获取最大优先级,确定预定任务的优先级的二进制值作为当前二进制值,循环执行以下操作:针对当前二进制值,将当前二进制值中除最低位的1以外的其他位置置零后得到的二进制值,作为中间二进制值,将当前二进制值减去中间二进制值得到的二进制值作为下一次循环的当前二进制值。每次循环得到的当前二进制即为最大优先级的二进制值,上述循环是以树状数组存储任务列表中的每个任务对应的优先级的基础上进行,其在于获取计算前缀和所需的全部的元素的数组下标。
[0042]
根据本公开的示例性实施例,在服务器为redis服务器的情况下,获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级之后,还包括:在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数。根据本实施例,可以一次性的获取所有元素值。redis是一个使用ansi c编写的开源、支持网络、基于内存、分布式、可选持久性的键值对存储数据库。
[0043]
根据本公开的示例性实施例,在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数,包括:通过bitmap的bitfield命令,在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数。需要说明的是,bitmap是位图,其是redis中的一种提供比特位级别的读写接口的数据结构,支持随机访问。通过本实施例,通过bitmap的bitfield命令,实现一次性获取所有元素值。上述bitmap的bitfield命令可以操作bitmap中指定位置的数值,支持get/set/incrby等子命令。如bitfield tasks get u16 0代表获取tasks这个bitmap中从0开始的16位比特位所代表的无符号整数的值;bitfield tasks get u16 0 set u16 16 2代表除了获取上述的数值以外,同时在从第16位开始的连续16位比特位置处设置一个数值2,该命令会返回两个结果,一个是get子命令的值,其返回的是bitmap中最新的值,如0,另一个是set子命令的值,其返回的是bitmap中上一次的值,如0。
[0044]
在步骤s204中,通过将预定优先级分支上的最大优先级的节点对应的任务数求和,获取任务列表中处理顺序在预定任务之前的任务总数。例如,从服务器中获取以每次循环得到的当前二进制值为数组下标的元素值,对获取的所有元素值求和得到任务总数。
[0045]
根据本公开的示例性实施例,通过将预定优先级分支上的最大优先级的节点对应的任务数求和,获取任务列表中处理顺序在预定任务之前的任务总数,可以包括:将预定优先级分支上的最大优先级的节点对应的任务数求和,得到任务列表中优先级高于预定任务的优先级且处理顺序在预定任务前的第一任务总数;获取任务列表中与预定任务属于同一优先级且处理顺序在预定任务前的第二任务总数;将第一任务总数和第二任务总数求和,得到任务列表中处理顺序在预定任务前的任务总数。通过本实施例,一并获取了同一优先级中处理时间在预定任务之前的任务数,从而可以计算到准确的等待时间。
[0046]
具体地,树状数组的代码非常简洁,核心代码只有短短几行,假设用c来表示树状数组,当需要获取下标为x的前缀和(相当于上述第一任务总数),即时,调用含有如下代码的函数sum(x)即可:
[0047][0048]
其中,lowbit(x)是一个特殊的函数,它用于获取x的二进制中最低位的1对应的数值,代码如下:
[0049][0050][0051]
从上述代码可以看到,sum函数中的循环体最多运算o(log2n)次,这样一来,就可以在对数级的时间内求得结果,当n=10000时,只需要进行log2n=log210000≈13.28次运算即可得到结果,大大减少了运算量,降低了cpu的负载,提高了系统的响应速度和吞吐量。
[0052]
在步骤s205中,基于任务总数,确定预定任务处理前的等待时间。例如,可以基于所述任务总数和每个任务的执行时间,确定所述预定任务处理前的等待时间,其中每个任务的执行时间一般是相同的。
[0053]
根据本公开的示例性实施例,在确定任务列表中处理顺序在预定任务之前的任务总数之后,还包括:确定预定任务的优先级对应的任务的数量变化预定个数;获取当前优先级分支上大于预定任务的优先级的目标优先级;将预定任务的优先级和目标优先级中每个优先级的节点对应的任务数替换为对应的预定值,其中,对应的预定值是基于预定任务的优先级和目标优先级的节点对应的任务数分别和预定个数得到的。例如,可以将预定任务的优先级的二进制值作为当前二进制值;循环执行以下操作:针对当前二进制值,将当前二进制值中除最低位的1以外的其他位置置零后得到的二进制值,作为中间二进制值,将当前
二进制值加上中间二进制值得到的二进制值作为下一次循环的当前二进制值,直至当前二进制值达到优先级上限;将服务器中以每个当前二进制值为数组下标的元素值替换为对应的预定值,其中,对应的预定值是基于每个当前二进制对应的优先级所对应的任务的数量分别和预定个数得到的。通过本实施例,增加或者删除任务也可以在o(logn)的对数级时间内更新所有受到影响的前缀和。
[0054]
例如,当更改数组a中某个元素的值时,例如对下标为6的元素加1(就是往优先级为6的任务列表里新增一个任务),即a[6] =1,则调用含有如下代码的函数add(6,1):
[0055][0056][0057]
其中lowbit的定义同上。
[0058]
从上述代码可以看到,add函数中的循环体最多运算o(log2n)次,这样一来,就可以在对数级的时间内求得结果,当n=10000时,只需要进行log2n=log210000≈13.28次运算即可得到结果,大大减少了运算量,降低了cpu的负载,提高了系统的响应速度和吞吐量。
[0059]
根据本公开的示例性实施例,在服务器为redis服务器的情况下,将预定任务的优先级和目标优先级中每个优先级的节点对应的任务数替换为对应的预定值,包括:在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值。通过本实施例,可以一次性替换所有受到影响的元素值。
[0060]
根据本公开的示例性实施例,在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值,包括:通过bitmap的incrby命令,在redis服务器中预定任务的优先级和目标优先级中每个优先级的节点对应的比特位处的任务数替换为对应的预定值。通过本实施例,通过bitmap的incrby命令,实现一次性替换所有受到影响的元素值。需要说明的是,incrby子命令的格式与上述bitfield类似,本公开不再展开论述。
[0061]
综上,本公开采用了树状数组这种特殊的二进制相关的数据组织方式,其可以在o(logn)的对数级时间内求出任意前缀和,同时对于更新操作,即对数组中某个元素进行值的更改(如a[6] 1或a6.‑
1),也可以在o(logn)的对数级时间内更新所有受到影响的前缀和,可见,相比于相关技术中的线性级别的时间复杂度o(n),本公开缩短了处理时间,即达到对数级别的时间复杂度o(logn)。
[0062]
为了方便理解上述实施例,下面详细的进行说明。
[0063]
对于求前缀和的sum(x)函数,循环体中通过对x不断递减lowbit(x)值直至x为0,在这过程中需要把x对应的c[x]进行累加得到最后的结果,因此,在实时任务处理系统中,可以预先一次性算出所有的x值,然后一次性从bitmap中获取这些c[x]值,返回到程序中后进行累加即可得到最后的结果。比如计算sum(13)的结果,13的二进制值为1101,不断递减
lowbit(x)后分别能得到8、12、13,最后的前缀和结果为c[8] c[12] c[13],此时,向redis服务器发送bitfield tasks get u16 128 get u16 192 get u16 208,表示分别从第128位、192位、208位比特位处获取对应的16位无符号整数数值,也就是在bitmap中存储的对应的c[8]、c[12]、c[13]这三个值。redis服务器返回结果后,在程序中直接累加即可得到前缀和sum(13)的值,即优先级1~13的所有任务的数量。
[0064]
对于更改函数add(x,k),循环体通过对x不断累加lowbit(x)直至x大于n(任务优先级上限),在这过程中需要对x对应的c[x]累加上k,和上面类似,预先计算出所有的x,然后一次性对bitmap指定的位置发送incrby子命令。比如当n=20,x=13,k=1时,执行add(13,1),函数体内计算得到的x的值分别为13、14、16,因此向redis服务器发送bitfield tasks incrby u16 208 1 incrby u16 224 1 incrby u16 256 1,表示分别对第208位、224位、256位比特位处的16位无符号整数进行加1的操作,这样即可完成树状数组结构中所有位置的更新。
[0065]
以上就是使用redis的bitmap来实现树状数组求前缀和的整个算法,无论是查询前缀和sum(x)还是新增/删除某个位置的数量add(x,k)的操作,均是使用一条redis命令,使整个操作步骤原子化,避免了并发环境下数据冲突/资源竞争的问题;同时,满足了分布式的特性
‑‑
树状数组中的数据全部存放于分布式数据库redis中,任务处理系统只负责计算,不存储任何数据,可以随时平行扩容,大大提高了可用性;再有,能够实时快速地获取某个任务的等待时间,系统可以在毫秒级时间内计算并返回结果,同时对于某个优先级任务的增删,也可以在毫秒级时间内处理完成,非常高效,且部署上线后任务处理系统和redis服务器运行良好,cpu/内存消耗稳定,没有出现任何异常。
[0066]
下面简要说明采用redis服务器以树状数组的方式存储任务列表中的每个优先级对应的任务的数量的原理。上述代码中的运算全都是在内存中进行计算的,关键的数据
‑‑
数组c存放于服务器的内存中,而实时任务处理系统是分布式的,服务会部署到多台机器上,显然不能每台机器都保留自己的数据副本,这样会造成数据的不一致。本公开使用分布式内存数据库redis中一种特殊的数据结构bitmap结合树状数组,使树状数组求前缀和的方法可以应用到分布式系统中。
[0067]
具体地,要解决上述单机数据不共享的问题,理论上把数据从本机内存移动到分布式内存中即可,然后使用一个中心化的服务来管理这些数据以实现树状数组的算法。这样做有一个很明显的问题,就是这个服务只能有一个计算节点,否则也会出现不同计算节点的数据不一致的现象,但如果只有一个计算节点,就无法做到高可用,当这个计算节点宕机后,所有的数据都会丢失,影响将是不可接受的。因此,本公开选用了成熟开源的分布式内存数据库redis来存放树状数组中的数据,redis支持数据持久化以及主从切换,可用性很高,不会出现数据丢失的问题;同时把算法步骤放到多机部署的任务处理系统中,这样就能把树状数组的算法真正应用到分布式系统中了。
[0068]
至于分布式内存数据库的选取,为什么是redis而不是其他的内存数据库如memcache,这是因为只有redis中一种特殊的数据结构bitmap才能原子性地实现树状数组的sum和add函数中的算法代码。memcache中只是简单的k

v型数据结构,并不合适。而redis中其它定制化的数据结构如list、hash、zset等也不合适,这是因为,要实现树状数组的功能,首先需要一个完整的数组,即位置连续紧凑且支持随机访问(下标访问)的内存段,
redis中的list、hash、zset对外提供的应用程序接口api均不满足随机访问,而bitmap底层是一块连续的内存,提供访问特定位置数据的api。其次,树状数组的sum和add函数的while循环里有多次加/减操作,这一系列操作在分布式的并发环境下需要原子性执行,否则会造成数据错乱的现象,需要说明的是,原子性即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在redis中,让一系列运算步骤原子性执行有三种方式:
[0069]
(1)使用multi

exec事务机制:实现起来稍微复杂,而且会因为多条命令在网络中的往返以及multi

exec命令本身的逻辑导致性能问题;
[0070]
(2)使用lua脚本,把所有运算操作对应的命令放到一个lua脚本中发送给redis运行,这是个可选的方式,但是性能不是最优的;
[0071]
(3)使用redis原生的命令:最优的方式,使用bitmap自带的bitfield命令,把一系列运算操作通过bitfield发送给redis,即可达到目的。除了bitmap外,其它数据结构均不提供批量加/减操作的原生命令。
[0072]
图4是根据一示例性实施例示出的一种任务处理前等待时间的确定装置的框图。参照图4,该装置包括优先级确定单元40、分支确定单元42、最大优先级获取单元44、任务总数获取单元46和等待时间确定单元48。
[0073]
优先级确定单元40,被配置为确定任务列表中的预定任务的优先级;分支确定单元42,被配置为确定预定任务的优先级在服务器中所属的当前优先级分支,其中,服务器中以树状数组的形式存储任务列表对应的所有优先级;最大优先级获取单元44,被配置为获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级,其中,预定优先级分支上除父节点的优先级以外的所有节点的优先级均小于当前优先级分支上节点的优先级;任务总数获取单元46,被配置为通过将预定优先级分支上的最大优先级的节点对应的任务数求和,获取任务列表中处理顺序在预定任务之前的任务总数;等待时间确定单元48,被配置为基于任务总数,确定预定任务处理前的等待时间。
[0074]
根据本公开的实施例,任务总数获取单元46,还被配置为在获取任务列表中处理顺序在预定任务之前的任务总数之后,确定预定任务的优先级对应的任务的数量变化预定个数;获取当前优先级分支上大于预定任务的优先级的目标优先级;将预定任务的优先级和目标优先级中每个优先级的节点对应的任务数替换为对应的预定值,其中,对应的预定值是基于预定任务的优先级和目标优先级的节点对应的任务数分别和预定个数得到的。
[0075]
可选地,在服务器为redis服务器的情况下,最大优先级获取单元44,还被配置为获取服务器中与当前优先级分支属于同一父节点的预定优先级分支上的最大优先级之后,在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数。
[0076]
可选地,最大优先级获取单元44,还被配置为通过bitmap的bitfield命令,在redis服务器中每个最大优先级对应的比特位处,获取最大优先级的节点对应的任务数。
[0077]
可选地,在服务器为redis服务器的情况下,任务总数获取单元46,还被配置为在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对应的预定值。
[0078]
可选地,任务总数获取单元46,还被配置为通过bitmap的incrby命令,在redis服务器中预定任务的优先级和目标优先级中每个优先级对应的比特位处的任务数替换为对
应的预定值。
[0079]
可选地,上述任务总数获取单元46,还被配置为将预定优先级分支上的最大优先级的节点对应的任务数求和,得到任务列表中优先级高于预定任务的优先级且处理顺序在预定任务前的第一任务总数;获取任务列表中与预定任务属于同一优先级且处理顺序在预定任务前的第二任务总数;将第一任务总数和第二任务总数求和,得到任务列表中处理顺序在预定任务前的任务总数。
[0080]
根据本公开的实施例,可提供一种电子设备。图5是根据本公开实施例的一种电子设备500的框图,该电子设备包括至少一个存储器501和至少一个处理器502,所述至少一个存储器中存储有计算机可执行指令集合,当计算机可执行指令集合被至少一个处理器执行时,执行根据本公开实施例的任务处理前等待时间的确定方法。
[0081]
作为示例,电子设备500可以是pc计算机、平板装置、个人数字助理、智能手机、或其他能够执行上述指令集合的装置。这里,电子设备1000并非必须是单个的电子设备,还可以是任何能够单独或联合执行上述指令(或指令集)的装置或电路的集合体。电子设备500还可以是集成控制系统或系统管理器的一部分,或者可被配置为与本地或远程(例如,经由无线传输)以接口互联的便携式电子设备。
[0082]
在电子设备500中,处理器502可包括中央处理器(cpu)、图形处理器(gpu)、可编程逻辑装置、专用处理器系统、微控制器或微处理器。作为示例而非限制,处理器502还可包括模拟处理器、数字处理器、微处理器、多核处理器、处理器阵列、网络处理器等。
[0083]
处理器502可运行存储在存储器中的指令或代码,其中,存储器501还可以存储数据。指令和数据还可经由网络接口装置而通过网络被发送和接收,其中,网络接口装置可采用任何已知的传输协议。
[0084]
存储器501可与处理器502集成为一体,例如,将ram或闪存布置在集成电路微处理器等之内。此外,存储器502可包括独立的装置,诸如,外部盘驱动、存储阵列或任何数据库系统可使用的其他存储装置。存储器501和处理器502可在操作上进行耦合,或者可例如通过i/o端口、网络连接等互相通信,使得处理器502能够读取存储在存储器501中的文件。
[0085]
此外,电子设备500还可包括视频显示器(诸如,液晶显示器)和用户交互接口(诸如,键盘、鼠标、触摸输入装置等)。电子设备的所有组件可经由总线和/或网络而彼此连接。
[0086]
根据本公开的实施例,还可提供一种计算机可读存储介质,其中,当计算机可读存储介质中的指令被至少一个处理器运行时,促使至少一个处理器执行本公开实施例的任务处理前等待时间的确定方法。这里的计算机可读存储介质的示例包括:只读存储器(rom)、随机存取可编程只读存储器(prom)、电可擦除可编程只读存储器(eeprom)、随机存取存储器(ram)、动态随机存取存储器(dram)、静态随机存取存储器(sram)、闪存、非易失性存储器、cd

rom、cd

r、cd r、cd

rw、cd rw、dvd

rom、dvd

r、dvd r、dvd

rw、dvd rw、dvd

ram、bd

rom、bd

r、bd

r lth、bd

re、蓝光或光盘存储器、硬盘驱动器(hdd)、固态硬盘(ssd)、卡式存储器(诸如,多媒体卡、安全数字(sd)卡或极速数字(xd)卡)、磁带、软盘、磁光数据存储装置、光学数据存储装置、硬盘、固态盘以及任何其他装置,所述任何其他装置被配置为以非暂时性方式存储计算机程序以及任何相关联的数据、数据文件和数据结构并将所述计算机程序以及任何相关联的数据、数据文件和数据结构提供给处理器或计算机使得处理器或计算机能执行所述计算机程序。上述计算机可读存储介质中的计算机程序可在诸如客户端、
主机、代理装置、服务器等计算机设备中部署的环境中运行,此外,在一个示例中,计算机程序以及任何相关联的数据、数据文件和数据结构分布在联网的计算机系统上,使得计算机程序以及任何相关联的数据、数据文件和数据结构通过一个或多个处理器或计算机以分布式方式存储、访问和执行。
[0087]
根据本公开实施例,提供了一种计算机程序产品,包括计算机指令,计算机指令被处理器执行时实现本公开实施例的任务处理前等待时间的确定方法。
[0088]
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
[0089]
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献