通信方法及装置与流程

文档序号:31469197发布日期:2022-09-09 22:36阅读:48来源:国知局
通信方法及装置与流程

1.本技术涉及通信技术领域,尤其涉及一种通信方法及装置。


背景技术:

2.目前,redis数据库可用来实时存储网络设备上的业务相关数据。当网络设备异常重启时,可从redis数据库内读取数据并进行业务恢复。redis数据库是一个高性能的键-值(key-value)数据库,可接受对数据进行增、删、改、查等动作。
3.为了利用redis数据库进行网络设备重启后的业务恢复,需在网络设备正常运行时,向redis数据库内实时写入数据,以保证网络设备内当前数据与redis数据库内数据保持一致。尤其是,当网络设备与redis数据库断开连接时,将导致断连时间内数据无法写入redis数据库。在后续网络设备与redis数据库再次连接时,网络设备将把当前全部数据均批备至redis数据库。
4.当网络不稳定时,经常发生网络断开重连的情况。此时,为了保证网络设备内数据与redis数据库内数据保持一致,网络设备会频繁的向redis数据库内写入本地当前全部数据。若断连时间较短,则可能仅仅几条或几十条写命令操作失败。若断连时间较长,则可能几万条写命令操作失败。当网络设备与redis数据库重新建立连接后,则网络设备内可能已存在几万或几十万条数据,此时,将全部重新写入redis数据库,以实现网络设备的数据与redis数据库数据保持一致。那么,该动作将导致网络设备的cpu、网络带宽会被大量占用,同时,也大大消耗redis数据库的性能。
5.在实际网络环境中,存在多台网络设备向redis数据库进行数据备份时,整个网络将出现网络震荡。此时,网络资源被大量的数据同步占用,导致丢失其它业务通信报文,而redis数据库也无法及时响应正常的写入命令。


技术实现要素:

6.有鉴于此,本技术提供了一种通信方法及装置,用以解决在网络震荡情况下或断连时间较短的情况下,网络资源被大量的数据同步占用,导致丢失其它业务通信报文,而redis数据库也无法及时响应正常的写入命令的问题。
7.第一方面,本技术提供了一种通信方法,所述方法应用于lib库主线程,lib库在被业务模块初始化时创建存储缓冲区,所述存储缓冲区内存储待发送至redis数据库的每条业务数据的命令编号,多条业务数据的命令编号组成命令编号区间,所述方法包括:
8.当所述lib库创建的工作线程与所述redis数据库断连且重新建立连接后,获取第一命令编号,所述第一命令编号为所述redis数据库执行的最后一条成功操作命令的编号;
9.识别所述第一命令编号是否处于所述命令编号区间内;
10.若处于,则以所述第二命令编号为起始编号,以所述命令编号区间内第三命令编号为结束编号,获取所述起始编号与所述结束编号之间的全部命令编号,所述第二命令编号为与所述第一命令编号相邻且编号值大于所述第一命令编号的编号值,所述第三命令编
号为所述命令编号区间内的命令编号最大值;
11.向所述工作线程发送所述全部命令编号中每个命令编号对应的第一业务数据,以使得所述工作线程将所述第一业务数据封装为第一操作命令后向所述redis数据库发送,进而使得所述redis数据库再次执行所述第一操作命令。
12.第二方面,本技术提供了一种通信装置,所述装置应用于lib库主线程内,lib库在被业务模块初始化时创建存储缓冲区,所述存储缓冲区内存储待发送至redis数据库的每条业务数据的命令编号,多条业务数据的命令编号组成命令编号区间,所述装置包括:
13.获取单元,用于当所述lib库创建的工作线程与所述redis数据库断连且重新建立连接后,获取第一命令编号,所述第一命令编号为所述redis数据库执行的最后一条成功操作命令的编号;
14.识别单元,用于识别所述第一命令编号是否处于所述命令编号区间内;
15.所述获取单元还用于,若处于,则以所述第二命令编号为起始编号,以所述命令编号区间内第三命令编号为结束编号,获取所述起始编号与所述结束编号之间的全部命令编号,所述第二命令编号为与所述第一命令编号相邻且编号值大于所述第一命令编号的编号值,所述第三命令编号为所述命令编号区间内的命令编号最大值;
16.发送单元,用于向所述工作线程发送所述全部命令编号中每个命令编号对应的第一业务数据,以使得所述工作线程将所述第一业务数据封装为第一操作命令后向所述redis数据库发送,进而使得所述redis数据库再次执行所述第一操作命令。
17.第三方面,本技术提供了一种计算机程序产品,包括计算机程序,所述计算机程序可被一个或者多个处理器执行,用于实现前述第一方面所提供的通信方法。
18.因此,通过应用本技术提供的通信方法及装置,当lib库创建的工作线程与redis数据库断连且重新建立连接后,lib库主线程获取第一命令编号,第一命令编号为redis数据库执行的最后一条成功操作命令的编号;lib库识别第一命令编号是否处于命令编号区间内;若处于,则lib库主线程以第二命令编号为起始编号,以命令编号区间内第三命令编号为结束编号,获取起始编号与结束编号之间的全部命令编号,第二命令编号为与第一命令编号相邻且编号值大于第一命令编号的编号值,第三命令编号为命令编号区间内的命令编号最大值;lib库主线程向工作线程发送全部命令编号中每个命令编号对应的第一业务数据,以使得工作线程将第一业务数据封装为第一操作命令后向redis数据库发送,进而使得redis数据库再次执行第一操作命令。
19.如此,在网络振荡情况下或断连时间较短的情况下,网络设备无需将全部数据写入redis数据库,网络设备仅需将断连时间内未写入的数据写入redis数据库即可,极大缩短了更新时间,减少网络压力。解决了网络资源被大量的数据同步占用,导致丢失其它业务通信报文,而redis数据库也无法及时响应正常的写入命令的问题。
附图说明
20.图1为本技术实施例提供的通信方法的流程图;
21.图2为本技术实施例提供的存储缓冲区示意图;
22.图3为本技术实施例提供的通信装置结构图;
23.图4为本技术实施例提供的网络设备硬件结构体。
具体实施方式
24.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施例并不代表与本技术相一致的所有实施例。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。
25.在本技术使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术。在本技术和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相对应的列出项目的任何或所有可能组合。
26.应当理解,尽管在本技术可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本技术范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
27.下面对本技术实施例提供的通信方法进行详细地说明。参见图1,图1为本技术实施例提供的通信方法的流程图。该方法应用于lib库主线程。本技术实施例提供的通信方法可包括如下所示步骤。
28.步骤110、当所述lib库创建的工作线程与所述redis数据库断连且重新建立连接后,获取第一命令编号,所述第一命令编号为所述redis数据库执行的最后一条成功操作命令的编号。
29.具体地,redis lib库(后续简称为lib库)处于业务模块的进程上下文内,该lib库具体为一函数集合,其可提供多种api,以便于网络设备内各业务模块通过调用api读写redis数据库,而无需感知连接、读写细节。
30.业务模块读写redis数据库过程如下所述,在此仅简单描述。
31.业务模块可能会创建多个线程。选择某一线程需要调用lib库提供的api时,该线程可称为lib库主线程,其会调用lib库提供的初始化函数,lib库的初始化函数会创建多个工作线程,在获得redis数据库的地址信息后会把该信息发送给这些工作线程,指示这些工作线程根据地址信息与redis数据库建立连接。
32.待连接建立成功后,工作线程向lib库主线程发送连接建立通知消息。待接收到每个工作线程发送的连接建立通知消息后,lib库主线程向业务模块发送通知消息,以使得业务模块确定redis数据库为ready状态。
33.当业务模块收到lib库主线程的通知确定redis数据库为ready状态时,业务模块调用lib库提供的函数向lib库主线程传入待写入redis数据库的业务数据(在本技术实施例中,该业务数据包括待写入redis数据库的的数据以及操作类型,例如,写操作类型)。根据不同的业务数据,lib库主线程将业务数据哈希至对应的工作线程中。根据操作类型,工作线程将业务数据封装为操作命令后,通过已建立的连接,向redis数据库发送操作命令。redis数据库执行操作命令。上述操作命令具体为写操作命令。
34.在本技术实施例中,业务模块还利用lib库提供的初始化函数对lib库进行初始化,并向初始化函数传入用于指导创建存储缓冲区大小的参数。lib库接收到上述参数后,
判断该参数的值是否为0,如果为0,则表示业务模块不需要使用缓冲区功能,否则根据该参数创建缓冲区。存储缓冲区用于存储待写入redis数据库的业务数据、业务数据对应的命令编号、命令执行结果等等。存储缓冲区的大小可由用户根据网络设备的内存情况指定,例如50m或100m等等。
35.在上述过程中,工作线程可一次性向redis数据库发送一条操作命令,或者,可一次性下发多条操作命令,例如,一次性下发100条操作命令。redis数据库在命令执行多条操作命令时,自行将多条命令执行结果向工作线程返回,工作线程将多条命令执行结果(成功或失败,通过bool值表示)向lib库主线程发送。lib库主线程收到后会调用lib库处理函数,该函数会将多条命令执行结果存储在存储缓存区内,待后续进行查看。后续可一次性查看多条命令执行结果,lib库主线程根据执行结果实时刷新第一命令编号。
36.lib库主线程接收到业务模块传入的业务数据后,若该业务数据为待写入redis数据库的数据,则lib库主线程为该条业务数据设置命令编号。命令编号的大小为64位bit,起始值为1。业务模块每下发一条业务数据,lib库主线程将命令编号加1,例如,第一条业务数据的命令编号为1,第二条业务数据的命令编号为2。
37.然后,lib库主线程将业务数据、命令编号一同发送至对应的工作线程。根据操作类型,工作线程将业务数据封装为操作命令(具体为写操作命令)。当某个工作线程与redis数据库断连后,工作线程会通知lib库主线程,lib库主线程接收到通知后,依然可接收业务模块传入的业务数据,但lib库主线程不会再向任何工作线程发送。在存储缓冲区内存在空余存储空间时,lib库主线程将业务数据、命令编号一同存储至存储缓冲区内。
38.可以理解的是,在断连期间内,工作线程也不再向redis数据库发送操作指令。
39.在本技术实施例中,断连时间可为几秒或者几百毫秒。在经过几秒或者几百毫秒后,工作线程再次与redis数据库重新建立连接后通知lib库主线程,lib库主线程判断所有工作线程都与redis数据库建立连接后获取第一命令编号。第一命令编号为redis数据库执行的最后一条成功操作命令的命令编号,该命令编号前的所有操作命令都已执行成功。
40.可选地,存储缓冲区由多个结构数组构成,每个结构数组存储业务数据、业务数据对应的命令编号、命令执行结果。lib库主线程在存储缓冲区内还创建一变量,该变量用于存储redis数据库当前执行成功的最后一条操作命令的命令编号,该命令编号为当前执行成功的操作命令的最大编号,在其之前的所有命令编号对应的操作命令应都已执行成功。
41.redis数据库在将多条命令执行结果向工作线程返回后,工作线程将多条命令执行结果向lib库主线程发送。lib库主线程按照每条操作命令的命令编号,将每条操作命令的执行结果存储在命令编号对应的结构数组的结构中。
42.上述lib库将操作命令、命令编号存储至存储缓冲区的过程仅为简单描述,在后续的实施例中将进行详细说明。
43.步骤120、识别所述第一命令编号是否处于所述命令编号区间内。
44.具体地,根据步骤110的描述,lib库主线程获取到第一命令编号后,识别第一命令编号是否处于命令编号区间内。
45.若第一命令编号处于命令编号区间内,则lib库执行步骤130。
46.根据前述步骤可知,lib库主线程将命令编号存储至存储缓冲区,则在存储缓冲区内形成命令编号区间。该命令编号区间包括命令编号最小值以及命令编号最大值。
47.例如,存储缓存区的容量为缓存1000条业务数据,当前已存储500条业务数据。存储缓存区内的命令编号区间为[5000,5499],则命令编号最小值为5000,命令编号最大值为5499。lib库主线程将第一命令编号与命令编号最小值、命令编号最大值进行比较,以此确定第一命令编号是否处于命令编号区间内。
[0048]
若第一命令编号为5200,则lib库确定第一命令编号处于命令编号区间内,并执行步骤130。
[0049]
步骤130、若处于,则以所述第二命令编号为起始编号,以所述命令编号区间内第三命令编号为结束编号,获取所述起始编号与所述结束编号之间的全部命令编号,所述第二命令编号为与所述第一命令编号相邻且编号值大于所述第一命令编号的编号值,所述第三命令编号为所述命令编号区间内的命令编号最大值。
[0050]
具体地,根据步骤120的描述,lib库主线程确定第一命令编号处于命令编号区间内,则lib库主线程以第二命令编号为起始编号,以第三命令编号为结束编号,获取起始编号与结束编号之间的全部命令编号。
[0051]
其中,第二命令编号为与第一命令编号相邻且编号值大于第一命令编号的编号值,第三命令编号为命令编号区间内的命令编号最大值。
[0052]
例如,根据前述示例,第一命令编号为5200,命令编号最大值为5499,则第二命令编号为5201,第三命令编号为5499。也即是,起始编号为5201,结束编号为5499,lib库主线程获取5201-5499之间的全部命令编号。
[0053]
需要说明的是,在存储缓冲区内存在空余存储空间时,此时,无论工作线程与redis数据库连接或是断连,lib库主线程均可接收业务模块传入的待写入redis数据库的业务数据,并将业务数据、命令编号存储至存储缓冲区内。
[0054]
在上述示例中,redis数据库执行的最后一条成功操作命令的编号为5200,则说明5201-5499之间命令编号对应的操作命令redis数据库并未执行成功。一种可能为redis数据库执行失败,另一种可能为由于断连,工作线程并未向redis数据库下发。
[0055]
无论上述哪条原因,lib库主线程均确定5200之后的全部业务数据需再次向redis数据库下发,而5200之前包括5200的全部业务数据均已执行成功,无需再次向redis数据库下发。
[0056]
步骤140、向所述工作线程发送所述全部命令编号中每个命令编号对应的第一业务数据,以使得所述工作线程将所述第一业务数据封装为第一操作命令后向所述redis数据库发送,进而使得所述redis数据库再次执行所述第一操作命令。
[0057]
具体地,根据步骤130的描述,lib库主线程确定出全部命令编号后,根据全部命令编号,lib库主线程获取并向工作进程发送全部命令编号中每个命令编号对应的第一业务数据。
[0058]
工作线程根据操作类型,将第一业务数据封装为第一操作命令后向redis数据库发送,进而使得redis数据库再次执行第一操作命令。
[0059]
如图2所示,图2为本技术实施例提供的存储缓冲区示意图。在图2中,5000-5200对应的业务数据已执行成功;5201-5499对应的业务数据执行失败;剩余为空余存储空间。
[0060]
因此,通过应用本技术提供的通信方法,当lib库创建的工作线程与redis数据库断连且重新建立连接后,lib库主线程获取第一命令编号,第一命令编号为redis数据库执
行的最后一条成功操作命令的编号;lib库主线程识别第一命令编号是否处于命令编号区间内;若处于,则lib库主线程以第二命令编号为起始编号,以命令编号区间内第三命令编号为结束编号,获取起始编号与结束编号之间的全部命令编号,第三命令编号为命令编号区间内的命令编号最大值;lib库主线程向工作线程发送全部命令编号中每个命令编号对应的第一业务数据,工作线程将第一业务数据封装为第一操作命令后向redis数据库发送,进而使得redis数据库再次执行第一操作命令。
[0061]
如此,在网络振荡情况下或断连时间较短的情况下,网络设备无需将全部数据写入redis数据库,网络设备仅需将断连时间内未写入的数据写入redis数据库即可,极大缩短了更新时间,减少网络压力。解决了网络资源被大量的数据同步占用,导致丢失其它业务通信报文,而redis数据库也无法及时响应正常的写入命令的问题。
[0062]
可选地,在本技术实施例步骤130的识别过程中,还包括另一种情况,即lib库确定第一命令编号未处于命令编号区间内的情况。
[0063]
具体地,根据步骤120的描述,lib库主线程获取到第一命令编号后,识别第一命令编号是否处于命令编号区间内。
[0064]
若第一命令编号未处于命令编号区间内,则lib库主线程向业务模块发送第一通知消息,以使得业务模块根据第一通知消息确定redis数据库为ready状态。业务模块会向lib库主线程发送全部业务数据,该全部业务数据为工作线程与redis数据库断连之前已下发的所有业务数据。
[0065]
lib库主线程向工作线程发送全部业务数据,以使得工作线程根据操作类型,将业务数据封装为对应的操作命令,并向redis数据库发送全部操作命令,进而使得redis数据库再次执行全部操作命令。
[0066]
例如,存储缓存区的容量为缓存1000条业务数据,当前已存储1000条业务数据。存储缓存区内的命令编号区间为[5000,5999],则命令编号最小值为5000,命令编号最大值为5999。lib库主线程将第一命令编号与命令编号最小值、命令编号最大值进行比较,以此确定第一命令编号是否处于命令编号区间内。
[0067]
若第一命令编号为4000,则lib库主线程确定第一命令编号未处于命令编号区间内,并确定4001-4999对应的操作命令也未存储在存储缓冲区内。此时,lib库主线程确定需要向redis数据库同步全部数据(也即是所有的工作线程向redis数据库发送的第一条操作命令开始直至当前最后一条操作命令为止)。
[0068]
可选地,在本技术实施例步骤110之前,还包括lib库主线程得到第二业务数据以及第二业务数据的命令编号,并将获取的上述信息存储至存储缓冲区的过程。
[0069]
具体地,根据步骤110的描述,工作线程与redis数据库建立连接后,工作线程向lib库主线程发送通知。待接收到每个工作线程发送的通知消息后,lib库主线程向业务模块发送通知消息,以使得业务模块确定redis数据库为ready状态。
[0070]
业务模块向lib库主线程传入第二业务数据。若第二业务数据为待写入redis数据库的数据,则lib库主线程为每条第二业务数据设置命令编号。lib库主线程将第二业务数据命令编号一同发送至对应的工作线程。根据操作类型,工作线程将每个第二业务数据封装为对应的第二操作命令,通过已建立的连接,向redis数据库发送第二操作命令。
[0071]
lib库主线程将第二业务数据以及第二业务数据的命令编号存储至存储缓冲区。
[0072]
可选地,lib库主线程在执行上述将第二业务数据以及第二业务数据的命令编号存储至存储缓冲区的具体过程为:
[0073]
lib库主线程判断存储缓冲区内是否存在空余存储空间;若存储缓冲区内存在空余存储空间,则lib库主线程将第二业务数据以及第二业务数据的命令编号存储至存储缓冲区。
[0074]
若存储缓冲区内未存在空余存储空间,则lib库主线程从存储缓冲区内获取命令编号最小值对应的业务数据,将命令编号最小值对应的业务数据删除。lib库主线程将第二业务数据以及第二业务数据的命令编号存储至存储缓冲区。
[0075]
例如,根据前述示例,存储缓存区的容量为缓存1000条业务数据。存储缓存区内的命令编号区间为[5000,5999],当前已存储1000条业务数据。此时,第二业务数据的命令编号为6000。lib库主线程确定存储缓冲区内未存在空余存储空间,则lib库主线程获取5000对应的业务数据,将5000对应的业务数据(当然,命令编号5000也一同删除)。lib库主线程将第二业务数据以及第二业务数据的命令编号存储至存储缓冲区。当前存储缓存区内的命令编号区间为[5001,6000]。
[0076]
可选地,在本技术实施例中,还包括工作线程与redis数据库断连后,lib库主线程得到第三业务数据以及为第三业务数据的命令进行编号,并将获取的上述信息存储至存储缓冲区的过程。
[0077]
具体地,工作线程与redis数据库断连后,工作线程向lib库主线程发送通知,以告知lib库主线程目前已与redis数据库断连。lib库主线程确定工作线程已与redis数据库断连后,先不向业务模块发送通知消息,以使得业务模块对断连事件无感知。业务模块仍认为redis数据库为ready状态,并继续向lib库主线程传入业务数据。
[0078]
若第三业务数据为待写入redis数据库的数据,则lib库主线程为每条第三业务数据设置命令编号。由于工作线程已与redis数据库断连,此时,lib库主线程不再将第三业务数据以及命令编号发送至对应的工作线程中。
[0079]
lib库主线程将第三业务数据以及第三业务数据的命令编号存储至存储缓冲区。
[0080]
可以理解的是,在断连期间内,工作线程不再向redis数据库发送操作指令。
[0081]
可选地,lib库主线程在执行上述第三业务数据以及第三业务数据的命令编号存储至存储缓冲区的具体过程为:
[0082]
lib库主线程判断存储缓冲区内是否存在空余存储空间;若存储缓冲区内存在空余存储空间,则lib库主线程将第三业务数据以及第三业务数据的命令编号存储至存储缓冲区。
[0083]
若存储缓冲区内未存在空余存储空间,则lib库主线程从存储缓冲区内获取命令编号最小值对应的业务数据,识别命令编号最小值对应的业务数据是否已被redis数据库执行成功。
[0084]
lib库主线程查看存储缓冲区内存储的命令执行结果,以识别命令编号最小值对应的业务数据是否已被redis数据库执行成功。
[0085]
若命令编号最小值对应的业务数据执行失败,则lib库主线程保留命令编号最小值对应的业务数据,并将工作线程与redis数据库之间的连接状态设置为异常状态(即断连事件,redis数据库为not ready状态)。
[0086]
当lib库主线程确定redis数据库为not ready状态时,lib库主线程向业务模块发送第二通知消息。业务模块接收到第二通知消息后,根据第二通知消息确定redis数据库为not ready状态,业务模块不再向lib库主线程传入业务数据。
[0087]
lib库主线程删除存储缓冲区内已存储的全部业务数据以及全部业务数据的命令编号。
[0088]
可选地,在本技术实施例中,lib库主线程清空存储缓冲区后,还包括当所有工作线程均与redis数据库重新建立连接时,lib库主线程向业务模块发送第三通知消息。业务模块根据第三通知消息确定redis数据库为ready状态,向lib库主线程传入全部业务数据的过程。
[0089]
具体地,根据前述可知,lib库已清空存储缓冲区。当所有工作线程均与redis数据库重新建立连接后lib主线程向业务模块发送第三通知消息,业务模块根据第三通知消息确定redis数据库为ready状态,业务模块向lib库主线程传入全部业务数据。
[0090]
lib库主线程向工作线程发送全部业务数据,以使得根据操作类型,工作线程将业务数据封装为对应的操作命令,并向redis数据库发送全部操作命令,进而使得redis数据库再次执行全部操作命令。
[0091]
在本技术实施例中,当lib库主线程已感知到工作线程与redis server断连后,lib库主线程追溯redis数据库执行失败的命令编号。原因在于,lib库主线程在感知到断连时,可能在先已经出现了redis数据库执行操作命令失败的情况。
[0092]
例如,存储缓冲区的容量为缓存1000条业务数据,当前存储缓存区内的命令编号区间为[5000,5999],即存储缓存区未存在空余存储空间。
[0093]
lib库主线程感知到工作线程与redis数据库断连后且确定5900-5999对应的操作命令均已执行失败。此时,由于lib库主线程并未通知业务模块redis数据库为not ready状态,则业务模块继续向lib库主线程传入业务数据,由于5900之前对应的操作命令均已执行成功,则lib库主线程每获取到一条业务数据时,均将命令编号最小值对应的业务数据删除。
[0094]
比如,lib库主线程获取到业务数据1,该业务数据1的命令编号为6000,lib库将5000对应的业务数据删除,存储业务数据1以及命令编号6000。此时,存储缓冲区的命令编号区间为[5001,6000]。
[0095]
lib库主线程可重复执行上述过程,直至获取到命令编号6900的业务数据时停止。由于存储缓冲区内命令编号区间为[5900,6899],已存储1000条业务数据,且5900对应的操作命令执行失败,lib库主线程不再删除5900对应的业务数据。原因在于,后续工作线程与redis数据库重新建立连接后,命令编号区间[5900,6899]内每个命令编号对应的业务数据均需再次发送至redis数据库。
[0096]
lib库主线程保留5900对应的业务数据,并将工作线程与redis数据库之间的连接状态设置为异常状态(即断连事件,redis数据库为notready状态)。
[0097]
lib库主线程确定redis数据库为not ready状态,则向业务模块发送通知消息。业务模块接收到通知消息后,确定redis数据库为not ready状态,业务模块不再向lib库主线程传入业务数据。lib库主线程清空存储缓冲区。
[0098]
当工作线程与redis数据库重新建立连接后,lib库主线程接收到通知消息后,判
断当前是否所有工作线程均已与redis数据库建立连接。如果是,则向业务模块发送通知消息,业务模块接收到通知消息后,确定redis数据库为ready状态。业务模块向lib主线程发送全部业务数据。lib库主线程向工作线程发送全部业务数据,以使得根据操作类型,工作线程将业务数据封装为对应的操作命令,并向redis数据库发送全部操作命令,进而使得redis数据库再次执行全部操作命令。
[0099]
因此,通过应用本技术提供的通信方法,当lib库创建的工作线程与redis数据库断连且重新建立连接后,lib库获取第一命令编号,第一命令编号为redis数据库执行的最后一条成功操作命令的编号;lib库识别第一命令编号是否处于命令编号区间内;若处于,则工作线程以第二命令编号为起始编号,以命令编号区间内第三命令编号为结束编号,获取起始编号与结束编号之间的全部命令编号,第二命令编号为与第一命令编号相邻且编号值大于第一命令编号的编号值,第三命令编号为命令编号区间内的命令编号最大值;lib库主线程向工作线程发送全部命令编号中每个命令编号对应的第一业务数据,以使得工作线程将第一业务数据封装为第一操作命令后向redis数据库发送,进而使得redis数据库再次执行第一操作命令。
[0100]
如此,在网络振荡情况下或断连时间较短的情况下,网络设备无需将全部数据写入redis数据库,网络设备仅需将断连时间内未写入的数据写入redis数据库即可,极大缩短了更新时间,减少网络压力。解决了网络资源被大量的数据同步占用,导致丢失其它业务通信报文,而redis数据库也无法及时响应正常的写入命令的问题。
[0101]
基于同一发明构思,本技术实施例还提供了与通信方法对应的通信装置。参见图3,图3为本技术实施例提供的一种通信装置,所述装置应用于lib库主线程,lib库在被业务模块初始化时创建存储缓冲区,所述存储缓冲区内存储待发送至redis数据库的每条业务数据的命令编号,多条业务数据的命令编号组成命令编号区间,所述装置包括:
[0102]
第一获取单元310,用于当所述lib库创建的工作线程与所述redis数据库断连且重新建立连接后,获取第一命令编号,所述第一命令编号为所述redis数据库执行的最后一条成功操作命令的编号;
[0103]
识别单元320,用于识别所述第一命令编号是否处于所述命令编号区间内;
[0104]
第二获取单元330,用于若处于,则以第二命令编号为起始编号,以所述命令编号区间内第三命令编号为结束编号,获取所述起始编号与所述结束编号之间的全部命令编号,所述第二命令编号为与所述第一命令编号相邻且编号值大于所述第一命令编号的编号值,所述第三命令编号为所述命令编号区间内的命令编号最大值;
[0105]
发送单元340,用于向所述工作线程发送所述全部命令编号中每个命令编号对应的第一业务数据,以使得所述工作线程将所述第一业务数据封装为第一操作命令后向所述redis数据库发送,进而使得所述redis数据库再次执行所述第一操作命令。
[0106]
可选地,所述发送单元340还用于,若未处于,则向所述业务模块发送第一通知消息,以使得所述业务模块确定所述redis数据库为notready状态;
[0107]
所述装置还包括:接收单元(图中未示出),用于接收所述业务模块发送的所述工作线程与所述redis数据库断连之前已下发的全部业务数据;
[0108]
所述发送单元340还用于,向所述工作线程发送所述全部业务数据,以使得所述工作线程将所述全部业务数据封装为对应的操作命令,并向所述redis数据库发送全部操作
命令,进而使得所述redis数据库再次执行所述全部操作命令。
[0109]
可选地,所述装置还包括:第三获取单元(图中未示出),用于当所述工作线程与所述redis数据库建立连接后,得到第二业务数据以及所述第二业务数据的命令编号;
[0110]
第一存储单元(图中未示出),用于将所述第二业务数据以及所述第二业务数据的命令编号存储至所述存储缓冲区。
[0111]
可选地,所述第一存储单元(图中未示出)具体用于,判断所述存储缓冲区内是否存在空余存储空间;
[0112]
若存在,则将所述第二业务数据以及所述第二业务数据的命令编号存储至所述存储缓冲区;
[0113]
若未存在,则从所述存储缓冲区内获取命令编号最小值对应的业务数据,将所述命令编号最小值对应的业务数据删除,并将所述第二业务数据以及所述第二业务数据的命令编号存储至所述存储缓冲区。
[0114]
可选地,所述装置还包括:第四获取单元(图中未示出),用于当所述工作线程与所述redis数据库断连后,得到第三业务数据以及所述第三业务数据的命令编号;
[0115]
第二存储单元(图中未示出),用于将第三业务数据以及所述第三业务数据的命令编号存储至所述缓冲区。
[0116]
可选地,所述第二存储单元(图中未示出)具体用于:判断所述存储缓冲区内是否存在空余存储空间;
[0117]
若存在,则将所述第三业务数据以及所述第三业务数据的命令编号存储至所述存储缓冲区存储至所述存储缓冲区;
[0118]
若未存在,则从所述存储缓冲区内获取命令编号最小值对应的业务数据,识别所述命令编号最小值对应的业务数据是否已被所述redis数据库执行成功;
[0119]
若执行失败,则保留所述命令编号最小值对应的业务数据,并将所述工作线程与所述redis数据库之间的连接状态设置为异常状态;
[0120]
向所述业务模块发送第二通知消息,以使得所述业务模块确定所述redis数据库为not ready状态并不再向所述lib库主进程传入发送业务数据;
[0121]
删除所述存储缓冲区内已存储的全部业务数据以及所述全部业务数据的命令编号。
[0122]
可选地,所述发送单元340还用于,当所述工作线程与所述redis数据库重新建立连接后,向所述工作线程发送第三通知消息,以使得所述工作线程确定所述redis数据库为ready状态;
[0123]
所述接收单元(图中未示出)还用于接收所述业务模块发送的所述工作线程与所述redis数据库断连之前已下发的全部业务数据;
[0124]
所述发送单元340还用于,向所述工作线程发送所述全部业务数据,以使得所述工作线程将所述全部业务数据封装为对应的操作命令,并向所述redis数据库发送全部操作命令,进而使得所述redis数据库再次执行所述全部操作命令。
[0125]
因此,通过应用本技术提供的通信装置,当lib库创建的工作线程与redis数据库断连且重新建立连接后,lib库主线程获取第一命令编号,第一命令编号为redis数据库执行的最后一条成功操作命令的编号;lib库识别第一命令编号是否处于命令编号区间内;若
处于,则lib库主线程以第二命令编号为起始编号,以命令编号区间内第三命令编号为结束编号,获取起始编号与结束编号之间的全部命令编号,第二命令编号为与第一命令编号相邻且编号值大于第一命令编号的编号值,第三命令编号为命令编号区间内的命令编号最大值;lib库主线程向工作线程发送全部命令编号中每个命令编号对应的第一业务数据,以使得工作线程将第一业务数据封装为第一操作命令后向redis数据库发送,进而使得redis数据库再次执行第一操作命令。
[0126]
如此,在网络振荡情况下或断连时间较短的情况下,网络设备无需将全部数据写入redis数据库,网络设备仅需将断连时间内未写入的数据写入redis数据库即可,极大缩短了更新时间,减少网络压力。解决了网络资源被大量的数据同步占用,导致丢失其它业务通信报文,而redis数据库也无法及时响应正常的写入命令的问题。
[0127]
基于同一发明构思,本技术实施例还提供了一种网络设备,如图4所示,包括处理器410、收发器420和机器可读存储介质430,机器可读存储介质430存储有能够被处理器410执行的机器可执行指令,处理器410被机器可执行指令促使执行本技术实施例所提供的通信方法。前述图3所示的通信装置,可采用如图4所示的网络设备硬件结构实现。
[0128]
上述计算机可读存储介质430可以包括随机存取存储器(英文:random access memory,简称:ram),也可以包括非易失性存储器(英文:non-volatile memory,简称:nvm),例如至少一个磁盘存储器。可选的,计算机可读存储介质430还可以是至少一个位于远离前述处理器410的存储装置。
[0129]
上述处理器410可以是通用处理器,包括中央处理器(英文:central processing unit,简称:cpu)、网络处理器(英文:network processor,简称:np)等;还可以是数字信号处理器(英文:digital signal processor,简称:dsp)、专用集成电路(英文:application specific integrated circuit,简称:asic)、现场可编程门阵列(英文:field-programmable gate array,简称:fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
[0130]
本技术实施例中,处理器410通过读取机器可读存储介质430中存储的机器可执行指令,被机器可执行指令促使能够实现处理器410自身以及调用收发器420执行前述本技术实施例描述的通信方法。
[0131]
另外,本技术实施例提供了一种机器可读存储介质430,机器可读存储介质430存储有机器可执行指令,在被处理器410调用和执行时,机器可执行指令促使处理器410自身以及调用收发器420执行前述本技术实施例描述的通信方法。
[0132]
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0133]
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本技术方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0134]
对于通信装置以及机器可读存储介质实施例而言,由于其涉及的方法内容基本相
似于前述的方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0135]
以上所述仅为本技术的较佳实施例而已,并不用以限制本技术,凡在本技术的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本技术保护的范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1