一种实现数据同步的方法及系统转让专利

申请号 : CN201310175253.8

文献号 : CN104156361A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 朱国云

申请人 : 阿里巴巴集团控股有限公司

摘要 :

本申请公开了一种实现数据同步的方法及系统,包括在缓存单元中设置独立的失效服务;当数据库更新数据后,本地机房的失效服务与其它机房的失效服务交互进行失效处理,将当前更新的数据设置为失效状态;业务单元访问缓存单元时,在访问数据的失效状态解除后更新访问数据。从本申请方案可见,在数据库进行更新同步中,各机房中缓存单元中对应的正在更新的数据是处于失效状态的,也就是不允许被访问的;而在数据库同步完成,当失效状态解除后,利用同步后的数据库中的数据对缓存单元中的数据进行更新。通过本申请,稳定、简单地保证了正确地实现多机房间缓存单元的数据同步,从而最终保证了缓存单元与数据库中数据的一致性。

权利要求 :

1.一种实现数据同步的方法,其特征在于,在缓存单元中设置独立的用于提供数据失效处理的失效服务,还包括:当数据库更新数据后,本地机房的失效服务与其它机房的缓存单元交互进行失效处理,将当前更新的数据设置为失效状态;

业务单元访问缓存单元时,在访问数据的失效状态解除后更新访问数据。

2.根据权利要求1所述的方法,其特征在于,该方法之前还包括:所述本地机房的业务单元更新本地数据库中的数据,更新完成后,本地数据库向其它机房中的数据库同步更新的数据。

3.根据权利要求1或2所述的方法,其特征在于,所述本地机房的失效服务与其它机房的缓存单元交互进行失效处理包括:所述本地机房的业务单元向本地失效服务发送失效请求;

本地失效服务收到失效请求,将失效请求放入后台处理队列,删除更新的数据记录对应的键key值;

本地失效服务的后台线程异步将收到的失效请求发送给其它各机房的缓存单元;

其它机房缓存单元收到失效请求后,判断出自身存储有失效请求中的键Key值时,将该键key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间;

判断出自身未存储有失效请求中的键Key值时,将该键key值写入缓存单元并设为空,将该key值对应的dirty标识设置为脏dirty,并设置该dirty标识的过期时间。

4.根据权利要求3所述的方法,其特征在于,所述发送给其它各机房的失效请求中,还包括预先设置在失效服务上的单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时;

所述过期时间为:当前时间与所述单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时之和。

5.根据权利要求4所述的方法,其特征在于,从所述本地机房数据库同步到其它各机房数据库的所述最大延时相同,和/或不同。

6.根据权利要求3所述的方法,其特征在于,所述删除更新的数据记录对应的键key值后,该方法还包括:所述本地失效服务向业务单元返回表示已经收到失效请求的响应。

7.根据权利要求3所述的方法,其特征在于,该方法还包括:所述其它各机房的缓存单元向所述本地机房的失效服务返回请求成功响应。

8.根据权利要求3所述的方法,其特征在于,所述本地失效服务在预设时间内未接收到来自其它各机房的缓存单元的响应,该方法还包括:所述本地失效服务将失效请求放入重试队列,由重试线程重新发送;

当重试发送次数超过预先设置的次数时,所述本地失效服务将发送失败的失效请求记录在最终失败队列;

所述本地机房发出告警,待告警消除后,通过人工启动命令再次发送最终失败队列中的失效请求。

9.根据权利要求1或2所述的方法,其特征在于,所述业务单元访问缓存单元为读取操作;所述更新访问数据包括:所述业务单元向缓存单元发送读取请求;

所述缓存单元收到读取请求后,判断需要读取的Key值是否存在,在所述需要读取的键Key值存在时,判断该键Key值的脏dirty标识是否显示为脏dirty,以及该键Key值的脏dirty标识是否过期:如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期时,所述缓存单元删除需要读取的键Key值;向业务单元返回需要读取的数据不存在;

如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期,所述缓存单元向业务单元返回需要读取的数据不存在;

如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty,所述缓存单元向业务单元返回需要读取的键Key值。

10.根据权利要求1或2所述的方法,其特征在于,所述业务单元访问缓存单元为写入操作;所述更新访问数据包括:所述业务单元向缓存单元发送写入请求;

所述缓存单元收到写入请求后,判断需要读取的键Key值是否存在,在所述需要读取的键Key值存在时,判断该键Key值的脏dirty标识是否显示为脏dirty,以及该键Key值的脏dirty标识是否过期:如果判断出需要写入的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期,所述缓存单元将写入的键Key值的脏dirty标识设置为清洁clean,并用业务单元写入的值对该键Key值进行更新;

如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期,所述缓存单元向业务单元返回写入成功;

如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty时,所述缓存单元写入该键Key值。

11.根据权利要求1或2所述的方法,其特征在于,该方法还包括:所述失效状态的数据对应的脏dirty标识过期时,所述数据所在缓存单元的后台线程更改该数据的脏dirty标识为清洁clean。

12.一种实现数据同步的系统,其特征在于,包括业务单元、数据库,以及设置有独立的用于提供数据失效处理的失效模块的缓存单元;其中,业务单元,用于更新本地数据库的数据;向本地缓存单元中的失效模块发起失效请求;

访问缓存单元,在访问数据的失效状态解除后更新访问数据;

数据库,其中本地数据库用于按照业务单元的指示更新数据,在数据更新完成后,完成与其它机房中的数据库的同步更新;

缓存单元,其中本地缓存单元的本地失效模块,用于接收来自业务单元的第一失效请求,将当前更新的数据设置为失效状态,向其它机房的缓存单元发送第二失效请求;其它机房的缓存单元,用于接收来自所述本地失效模块的第二失效请求,将当前更新的数据设置为失效状态。

13.根据权利要求12所述的系统,其特征在于,

所述本地失效模块,具体用于:接收来自所述业务单元的第一失效请求,将第一失效请求中携带的键key值的脏dirty标识设置为脏dirty,删除更新的数据记录对应的键key值;

将接收到的失效请求放入后台处理队列,通过其后台线程异步将收到的失效请求发送至其它各机房的缓存单元;此时,所述业务单元,进一步用于将更新的数据记录的新的键key值写回本地缓存单元。

14.根据权利要求13所述的系统,其特征在于,所述本地失效模块,还用于向所述业务单元返回表示已经收到失效请求的响应。

15.根据权利要求12所述的系统,其特征在于,所述其它机房的缓存单元,具体用于:接收来自所述本地缓存单元的失效模块的第二失效请求,

在自身存储有第二失效请求中的键Key值时,将该键key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间;

在自身未存储有第二失效请求中的键Key值时,将该键key值写入自身所在的缓存系单元并设为空,将该键key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间;

所述发送给其它各个机房的失效请求中,还包括预先设置在失效模块上的单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时;

所述过期时间为:当前时间与所述单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时之和。

16.根据权利要求12~15任一项所述的系统,其特征在于,所述失效模块是缓存单元中一个独立的服务。

17.根据权利要求12~15任一项所述的系统,其特征在于,当所述业务单元访问缓存单元为读取操作时,所述业务单元,还用于向本地缓存单元发送读取请求;接收来自本地缓存单元返回的响应;

所述本地缓存单元,还用于:在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期时,删除需要读取的键Key值;向业务单元返回需要读取的数据不存在;

在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期时,向业务单元返回需要读取的数据不存在;

在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty时,向业务单元返回需要读取的键Key值。

18.根据权利要求12~15任一项所述的系统,其特征在于,当业务单元访问缓存单元为写入操作时,所述业务单元,还用于向本地缓存单元发送写入请求;接收来自本地缓存单元返回的响应;

所述本地缓存单元,还用于:在判断出需要写入的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期时,将写入的键Key值的脏dirty标识设置为清洁clean,并用业务单元写入的值对该键Key值进行更新;

在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期时,向业务单元返回写入成功;

在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty时,写入该键Key值。

19.根据权利要求16所述的系统,其特征在于,所述缓存单元,还用于在失效的键Key值的脏dirty标识过期时,其后台线程会更改该键Key值的脏dirty标识为清洁clean。

说明书 :

一种实现数据同步的方法及系统

技术领域

[0001] 本申请涉及多机房服务技术,尤指一种多机房情况下,实现数据同步的方法及系统。

背景技术

[0002] 随着当前业务规模的扩展与机房容灾需求的增加,单机房服务已经不能承担整个业务的需求。因此,需要在多个机房内分别部署各自的运行系统,包括业务单元、缓存单元和数据库。
[0003] 在各个运行系统中,缓存单元的数据是来自数据库的,当数据库发生更新后,缓存单元中的数据必须在一段时间内清除或更新,而不能长时间存在脏数据以影响业务。单机房的情况下,在业务单元对数据库更新后,可以由业务单元直接将更新的字段写回缓存单元,来保持本地缓存单元与数据库的一致性即缓存单元与数据库数据同步。而多个机房之间,业务单元是不会跨机房调用缓存单元的,所以,当数据库更新后,如何保证多个机房内缓存单元中的数据与数据库的一致,是一个重要的技术问题。

发明内容

[0004] 为了解决上述技术问题,本申请提供了一种实现数据同步的方法及系统,能够稳定、简单地保证正确实现多机房间缓存单元的数据同步,最终保证缓存单元与数据库中数据的一致性。
[0005] 为了达到本申请目的,本申请提供一种实现数据同步的方法,在缓存单元中设置独立的用于提供数据失效处理的失效服务,还包括:
[0006] 当数据库更新数据后,本地机房的失效服务与其它机房的缓存单元交互进行失效处理,将当前更新的数据设置为失效状态;
[0007] 业务单元访问缓存单元时,在访问数据的失效状态解除后更新访问数据。
[0008] 该方法之前还包括:所述本地机房的业务单元更新本地数据库中的数据,更新完成后,本地数据库向其它机房中的数据库同步更新的数据。
[0009] 所述本地机房的失效服务与其它机房的缓存单元交互进行失效处理包括:
[0010] 所述本地机房的业务单元向本地失效服务发送失效请求;
[0011] 本地失效服务收到失效请求,将失效请求放入后台处理队列,删除更新的数据记录对应的键key值;
[0012] 本地失效服务的后台线程异步将收到的失效请求发送给其它各机房的缓存单元;
[0013] 其它机房缓存单元收到失效请求后,判断出自身存储有失效请求中的键Key值时,将该键key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间;
[0014] 判断出自身未存储有失效请求中的键Key值时,将该键key值写入缓存单元并设为空,将该key值对应的dirty标识设置为脏dirty,并设置该dirty标识的过期时间。
[0015] 所述发送给其它各机房的失效请求中,还包括预先设置在失效服务上的单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时;
[0016] 所述过期时间为:当前时间与所述单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时之和。
[0017] 从所述本地机房数据库同步到其它各机房数据库的所述最大延时相同,和/或不同。
[0018] 所述删除更新的数据记录对应的键key值后,该方法还包括:所述本地失效服务向业务单元返回表示已经收到失效请求的响应。
[0019] 该方法还包括:所述其它各机房的缓存单元向所述本地机房的失效服务返回请求成功响应。
[0020] 所述本地失效服务在预设时间内未接收到来自其它各机房的缓存单元的响应,该方法还包括:
[0021] 所述本地失效服务将失效请求放入重试队列,由重试线程重新发送;
[0022] 当重试发送次数超过预先设置的次数时,所述本地失效服务将发送失败的失效请求记录在最终失败队列;
[0023] 所述本地机房发出告警,待告警消除后,通过人工启动命令再次发送最终失败队列中的失效请求。
[0024] 所述业务单元访问缓存单元为读取操作;所述更新访问数据包括:
[0025] 所述业务单元向缓存单元发送读取请求;
[0026] 所述缓存单元收到读取请求后,判断需要读取的Key值是否存在,在所述需要读取的键Key值存在时,判断该键Key值的脏dirty标识是否显示为脏dirty,以及该键Key值的脏dirty标识是否过期:
[0027] 如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期时,所述缓存单元删除需要读取的键Key值;向业务单元返回需要读取的数据不存在;
[0028] 如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期,所述缓存单元向业务单元返回需要读取的数据不存在;
[0029] 如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty,所述缓存单元向业务单元返回需要读取的键Key值。
[0030] 所述业务单元访问缓存单元为写入操作;所述更新访问数据包括:
[0031] 所述业务单元向缓存单元发送写入请求;
[0032] 所述缓存单元收到写入请求后,判断需要读取的键Key值是否存在,在所述需要读取的键Key值存在时,判断该键Key值的脏dirty标识是否显示为脏dirty,以及该键Key值的脏dirty标识是否过期:
[0033] 如果判断出需要写入的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期,所述缓存单元将写入的键Key值的脏dirty标识设置为清洁clean,并用业务单元写入的值对该键Key值进行更新;
[0034] 如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期,所述缓存单元向业务单元返回写入成功;
[0035] 如果判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty时,所述缓存单元写入该键Key值。
[0036] 该方法还包括:所述失效状态的数据对应的脏dirty标识过期时,所述数据所在缓存单元的后台线程更改该数据的脏dirty标识为清洁clean。
[0037] 本申请还提供一种实现数据同步的系统,包括业务单元、数据库,以及设置有独立的用于提供数据失效处理的失效模块的缓存单元;其中,
[0038] 业务单元,用于更新本地数据库的数据;向本地缓存单元中的失效模块发起失效请求;访问缓存单元,在访问数据的失效状态解除后更新访问数据;
[0039] 数据库,其中本地数据库用于按照业务单元的指示更新数据,在数据更新完成后,完成与其它机房中的数据库的同步更新;
[0040] 缓存单元,其中本地缓存单元的本地失效模块,用于接收来自业务单元的第一失效请求,将当前更新的数据设置为失效状态,向其它机房的缓存单元发送第二失效请求;其它机房的缓存单元,用于接收来自所述本地失效模块的第二失效请求,将当前更新的数据设置为失效状态。
[0041] 所述本地失效模块,具体用于:接收来自所述业务单元的第一失效请求,将第一失效请求中携带的键key值的脏dirty标识设置为脏dirty,删除更新的数据记录对应的键key值;
[0042] 将接收到的失效请求放入后台处理队列,通过其后台线程异步将收到的失效请求发送至其它各机房的缓存单元;此时,
[0043] 所述业务单元,进一步用于将更新的数据记录的新的键key值写回本地缓存单元。
[0044] 所述本地失效模块,还用于向所述业务单元返回表示已经收到失效请求的响应。
[0045] 所述其它机房的缓存单元,具体用于:接收来自所述本地缓存单元的失效模块的第二失效请求,
[0046] 在自身存储有第二失效请求中的键Key值时,将该键key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间;
[0047] 在自身未存储有第二失效请求中的键Key值时,将该键key值写入自身所在的缓存系单元并设为空,将该键key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间;
[0048] 所述发送给其它各个机房的失效请求中,还包括预先设置在失效模块上的单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时;
[0049] 所述过期时间为:当前时间与所述单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时之和。
[0050] 所述失效模块是缓存单元中一个独立的服务。
[0051] 当所述业务单元访问缓存单元为读取操作时,
[0052] 所述业务单元,还用于向本地缓存单元发送读取请求;接收来自本地缓存单元返回的响应;
[0053] 所述本地缓存单元,还用于:在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期时,删除需要读取的键Key值;向业务单元返回需要读取的数据不存在;
[0054] 在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期时,向业务单元返回需要读取的数据不存在;
[0055] 在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty时,向业务单元返回需要读取的键Key值。
[0056] 当业务单元访问缓存单元为写入操作时,
[0057] 所述业务单元,还用于向本地缓存单元发送写入请求;接收来自本地缓存单元返回的响应;
[0058] 所述本地缓存单元,还用于:在判断出需要写入的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且已过期时,将写入的键Key值的脏dirty标识设置为清洁clean,并用业务单元写入的值对该键Key值进行更新;
[0059] 在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示为脏dirty且未过期时,向业务单元返回写入成功;
[0060] 在判断出需要读取的键Key值存在,该键Key值的脏dirty标识显示不为脏dirty时,写入该键Key值。
[0061] 所述缓存单元,还用于在失效的键Key值的脏dirty标识过期时,其后台线程会更改该键Key值的脏dirty标识为清洁clean。
[0062] 本申请提供的方案包括在缓存单元中设置独立的失效服务;当数据库更新数据后,本地机房的失效服务与其它机房的缓存单元交互进行失效处理,将当前更新的数据设置为失效状态;业务单元访问缓存单元时,在访问数据的失效状态解除后更新访问数据。本申请提供的方案中,在机房的数据库进行更新同步过程中,各机房中缓存单元中对应的正在更新的数据是处于失效状态的,也就是不允许被访问的;而在数据库同步完成,当失效状态解除后,利用同步后的数据库中的数据对缓存单元中的数据进行更新。通过本申请方法,稳定、简单地保证了正确地实现多机房间缓存单元的数据同步,从而最终保证了缓存单元与数据库中数据的一致性。
[0063] 本申请的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请而了解。本申请的目的和其它优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

[0064] 附图用来提供对本申请技术方案的进一步理解,并且构成说明书的一部分,与本申请的实施例一起用于解释本申请的技术方案,并不构成对本申请技术方案的限制。
[0065] 图1为现有多机房情况下,一种保证缓存单元与数据库数据同步的示意图;
[0066] 图2为现有多机房情况下,另一种保证缓存单元与数据库数据同步的示意图;
[0067] 图3为本申请实现数据同步的方法的流程图;
[0068] 图4为本申请其它缓存单元接收到失效请求后的处理流程图;
[0069] 图5为本申请业务单元读取数据的流程示意图;
[0070] 图6为本申请业务单元写入数据的流程示意图;
[0071] 图7为本申请实现数据同步的系统组成结构示意图。

具体实施方式

[0072] 为使本申请的目的、技术方案和优点更加清楚明白,下文中将结合附图对本申请的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
[0073] 在本申请一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
[0074] 内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
[0075] 计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其它数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其它类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其它内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其它光学存储、磁盒式磁带,磁带磁磁盘存储或其它磁性存储设备或任何其它非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0076] 在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0077] 目前,对于多机房的情况,保证缓存单元与数据库数据同步的解决方法有如下两种:
[0078] 图1是现有多机房情况下,一种保证缓存单元与数据库数据同步的示意图,如图1所示,大致包括:利用缓存单元进行数据同步,也就是说,当本地机房缓存单元数据变化后,通过本地缓存单元与其它机房的缓存单元间的同步机制来实现数据的同步。图1所示的同步方法中,由于缓存单元与数据库是异构系统,两者采用各自的同步方式,而在本地机房更新数据的同时,可能存在其它机房的业务单元更新缓存单元和数据库的情况,因此,是很难做到机房间缓存单元中的数据一致的。并且,缓存单元的目标是稳定、简单、高性能,如果在缓存单元层完成数据同步,无疑给缓存单元带来了更高的复杂性,从而影响了缓存单元自身的目标。
[0079] 图2是现有多机房情况下,另一种保证缓存单元与数据库数据同步的示意图,如图2所示,大致包括:在数据库上层设置一个适配服务(adapter)(图2中仅示出机房B中的适配服务),假设机房A中的数据库记录被更新后,通过数据库同步机制同步到机房B,然后再通过触发适配服务,反向删除机房B中的缓存单元中对应的记录。图2所示的同步方法中,虽然实现了缓存单元与数据库的同步,但是,实际应用中,由于很多业务单元在缓存单元中存放的键(key)值和数据库中的key值并不是同一个,因此,很难通过数据库中的key值反向删除缓存单元中对应的key值。为了保证图2所示同步方法的正确性,就需要每一个业务都写一个数据库key值到缓存单元key值的转换适配,也就是说,新增一个业务缓存功能,就需要写一个适配放入适配服务运行,从而给业务带来了巨大的工作量。
[0080] 图3为本申请实现数据同步的方法的流程图,如图3所示,包括:
[0081] 步骤300:在缓存单元中设置独立的失效服务。
[0082] 本步骤中,在各机房的缓存单元中都预先设置有独立的用于提供数据失效处理的失效服务。当失效服务收到来自业务单元的失效请求时,会将该失效请求放入后台处理队列,然后其后台线程会异步将收到的失效请求发送至其它各机房的缓存单元。
[0083] 每个机房的缓存单元中都有各自的失效服务,而且这些失效服务知道各个机房缓存单元的存在。比如,每个失效服务进程上直接配置有各个机房的缓存单元的标识(ID),通过该ID可以访问到不同的缓存单元。其中,该ID也可以理解为缓存单元的地址。
[0084] 步骤301:当数据库更新数据后,本地机房的失效服务与其它机房的缓存单元交互进行失效处理,将当前更新的数据设置为失效状态。具体包括:
[0085] 业务单元更新本机房(本地)数据库中的数据成功后,数据库开始向其它机房同步更新的数据;此时,
[0086] 业务单元调用本地缓存单元中的失效服务,比如采用invalid(key)方式发起失效请求,对更新的数据记录的key值进行失效处理:
[0087] 首先,本地失效服务收到失效请求,将失效请求放入后台处理队列;此时,删除更新的数据记录对应的key值。业务单元可以直接处理其它事务,或者将更新的数据记录的新的key值写回本地缓存单元,以已提高缓存命中率,或者;之后,本地失效服务可以进一步向业务单元返回响应,表示已经收到失效请求。
[0088] 接着,本地失效服务的后台线程异步将收到的失效请求发送给各个机房的缓存单元,在发往各个机房的缓存单元的失效请求中,还包括单条记录更新从本地机房数据库同步到其它各机房数据库的最大延时db_max_sync_time(下文中将其简称为延时时长db_max_sync_time),具体形式可以是invalid(key,db_max_sync_time)。其中,从本地机房数据库同步到其它各机房数据库的延时时长db_max_sync_time可以不同;延时时长db_max_sync_time是预先配置在失效服务上的,而且可以动态更改。进一步地,其它各机房的缓存单元可以返回请求成功响应。如果返回请求失败响应,那么,本地失效服务会通过各种出错处理及重新发送失效请求等来保证发送成功。比如,在本地失效服务在预设时间内未接收到响应时,会将失效请求放入重试队列。由重试线程重新发送;进一步地,当重试发送失效请求3次(可预先设置发送的次数)都失败后,将发送失败的失效请求记录在最终失败队列,这种情况一般是机房出现异常情况;进一步地,通过告警通知运维人员,在运维人员对异常情况进行处理即消除告警后,可以通过人工启动命令,再次发送最终失败队列中的失效请求。
[0089] 然后,如图4中步骤400~步骤401所示,其它机房的缓存单元收到失效请求后,判断自身是否存储有失效请求中的Key值。如图4中步骤402所示,如果其它机房的缓存单元判断出自身存储有失效请求中的Key值,将该key值对应的脏(dirty)标识设置为脏dirty,并设置该dirty标识的过期时间(expire_time)为:(当前时间now+延时时长db_max_sync_time);需要说明的是,如果该Key值的脏标识已为脏dirty,则只需设置过期时间即可。结束本流程。如图4中步骤403所示,如果其它机房的缓存单元判断出自身未存储有失效请求中的Key值,则将该key值写入缓存单元并设为空,同时,将该key值对应的dirty标识设置为脏dirty,并设置该dirty标识的过期时间为:(当前时间now+延时时长db_max_sync_time)。
[0090] 步骤302:业务单元访问缓存单元时,在访问数据的失效状态解除后更新访问数据。本步骤中,业务单元访问缓存单元包括读取和写入两种方式,下面分别进行描述。
[0091] 图5为本申请业务单元读取数据的流程示意图,如图5所示,包括:
[0092] 步骤500:缓存单元收到业务单元的读取请求后,判断需要读取的Key值是否存在,如果存在进入步骤501;否则进入步骤504。其中,业务单元可以通过get(key)实现读取操作。
[0093] 步骤501:缓存单元判断该Key值的脏dirty标识是否显示为脏dirty,如果是,进入步骤502;否则进入步骤505。
[0094] 步骤502:缓存单元判断该Key值的脏dirty标识是否过期,如果已过期,进入步骤503;否则进入步骤504。
[0095] 步骤503:缓存单元删除需要读取的Key值。
[0096] 步骤504:缓存单元向业务单元返回需要读取的数据不存在。结束本流程。
[0097] 步骤505:缓存单元向业务单元返回需要读取的Key值。
[0098] 图6为本申请业务单元写入数据的流程示意图,如图6所示,包括:
[0099] 步骤600:缓存单元收到业务单元的写入请求后,判断需要写入的Key值是否存在,如果存在进入步骤601;否则进入步骤604。其中,业务单元可以通过put(key,value)实现读取操作,其中value表示Key的值。
[0100] 步骤601:缓存单元判断该Key值的脏dirty标识是否显示为脏dirty,如果是,进入步骤602;否则进入步骤604。
[0101] 步骤602:缓存单元判断该Key值的脏dirty标识是否过期,如果已过期,进入步骤603;否则进入步骤605。
[0102] 步骤603:缓存单元将写入的Key值的脏dirty标识设置为清洁clean,并用业务单元写入的值对该Key值进行更新。
[0103] 步骤604:缓存单元写入该Key值。结束本流程。
[0104] 步骤605:缓存单元向业务单元返回写入成功。需要注意的是,此时,可能是数据库还没同步成功,为了防止产生脏dirty数据,缓存单元不对该Key值做任何处理。
[0105] 另外,如果在失效的Key值的脏dirty标识过期时,仍然没有被业务单元访问,那么,缓冲系统的后台线程会自行更改该Key值的脏dirty标识为清洁clean。
[0106] 通过本申请方法可见,在机房的数据库进行更新同步的过程中,各机房中的缓存单元中对应的正在更新的数据是处于失效状态的,也就是不允许被访问的;而在数据库同步完成,当失效状态解除后,利用同步后的数据库中的数据对缓存单元中的数据进行更新。通过本申请方法,稳定、简单地保证了正确地实现多机房间缓存单元的数据同步,从而最终保证了缓存单元与数据库中数据的一致性。
[0107] 之外,本申请还提供一种实现数据同步的系统,如图7所示,包括业务单元、数据库,以及设置有失效模块的缓存单元;其中,
[0108] 业务单元,用于更新本地数据库中的数据;向本地缓存单元中的失效模块发起失效请求;访问缓存单元,在访问数据的失效状态解除后更新访问的数据。
[0109] 数据库,其中,本地数据库用于按照业务单元的指示更新数据,在数据更新完成后,完成与其它机房中的数据库的同步更新;
[0110] 缓存单元,其中设置有独立的用于提供数据失效处理的失效模块;其中本地缓存单元的本地失效模块,用于接收来自业务单元的第一失效请求,将当前更新的数据设置为失效状态,向其它机房的缓存单元发送第二失效请求;其它机房的缓存单元,用于接收来自本地失效模块的第二失效请求,将当前更新的数据设置为失效状态。
[0111] 失效模块可以是缓存单元中一个独立的服务。每个机房的缓存单元中都有各自的失效服务,而且这些失效服务知道各个机房缓存单元的存在。
[0112] 其中,
[0113] 所述本地缓存单元的失效模块,具体用于接收来自业务单元的第一失效请求,将第一失效请求中携带的更新的数据记录对应的key值的脏dirty标识设置为脏dirty,删除更新的数据记录对应的key值;将该失效请求放入后台处理队列,通过其后台线程异步将收到的失效请求发送至其它各机房的缓存单元;此时,
[0114] 业务单元,进一步用于处理其它事务,或者将更新的数据记录的新的key值写回本地缓存单元。
[0115] 所述本地缓存单元的失效模块,进一步用于向业务单元返回表示已经收到失效请求的响应。
[0116] 另外,所述其它机房缓存单元,具体用于接收来自本地缓存单元的失效模块的第二失效请求,
[0117] 在自身存储有第二失效请求中的Key值时,将该key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间为:(当前时间now+第二失效请求中携带的延时时长db_max_sync_time);
[0118] 在自身未存储有第二失效请求中的Key值时,将该key值写入自身所在的缓存单元并设为空,同时,将该key值对应的脏dirty标识设置为脏dirty,并设置该dirty标识的过期时间为:(当前时间now+第二失效请求中携带的延时时长db_max_sync_time)。
[0119] 容易理解,其它机房的缓存系统中的失效模块,与上述本地机房的失效模块一样,对于其所在的机房来讲也是本地,同样会接收来自其所在机房的业务单元的失效请求,并将失效请求发送至其它各个机房中的缓存单元。
[0120] 当业务单元访问缓存单元为读取操作时,
[0121] 所述业务单元,还用于向本地缓存单元发送读取请求;接收来自本地缓存单元返回的响应;
[0122] 所述本地缓存单元,还用于:在判断出需要读取的Key值存在,该Key值的脏dirty标识显示为脏dirty且已过期时,删除需要读取的Key值;向业务单元返回需要读取的数据不存在;
[0123] 在判断出需要读取的Key值存在,该Key值的脏dirty标识显示为脏dirty且未过期时,向业务单元返回需要读取的数据不存在;
[0124] 在判断出需要读取的Key值存在,该Key值的脏dirty标识显示不为脏dirty时,向业务单元返回需要读取的Key值。
[0125] 当业务单元访问缓存单元为写入操作时,
[0126] 所述业务单元,还用于向本地缓存单元发送写入请求;接收来自本地缓存单元返回的响应;
[0127] 所述本地缓存单元,还用于:在判断出需要写入的Key值存在,该Key值的脏dirty标识显示为脏dirty且已过期时,将写入的Key值的脏dirty标识设置为清洁clean,并用业务单元写入的值对该Key值进行更新;
[0128] 在判断出需要读取的Key值存在,该Key值的脏dirty标识显示为脏dirty且未过期时,向业务单元返回写入成功;
[0129] 在判断出需要读取的Key值存在,该Key值的脏dirty标识显示不为脏dirty时,写入该Key值。
[0130] 所述缓存单元,还用于在失效的Key值的脏dirty标识过期时,其后台线程会更改该Key值的脏dirty标识为清洁clean。
[0131] 本领域的技术人员应该明白,上述的本申请实施例所提供的装置的各组成部分,以及方法中的各步骤,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上。可选地,它们可以用计算装置可执行的程序代码来实现。从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
[0132] 虽然本申请所揭露的实施方式如上,但所述的内容仅为便于理解本申请而采用的实施方式,并非用以限定本申请。任何本申请所属领域内的技术人员,在不脱离本申请所揭露的精神和范围的前提下,可以在实施的形式及细节上进行任何的修改与变化,但本申请的专利保护范围,仍须以所附的权利要求书所界定的范围为准。