具体实施方式
为了更好的理解上述技术方案,下面通过附图以及具体实施例对本说明书实施例的技术方案做详细的说明,应当理解本说明书实施例以及实施例中的具体特征是对本说明书实施例技术方案的详细的说明,而不是对本说明书技术方案的限定,在不冲突的情况下,本说明书实施例以及实施例中的技术特征可以相互组合。
参见图1,为本说明书实施例缓存同步应用场景示意图。图1中所示场景中,包括当前使用的APP(应用程序、应用)101、DB(数据库、Database) 102、Cache(缓存)103。在查询链路(读数据)过程中,APP从数据库中读取数据并写入缓存;在写链路(写数据)过程中,APP向数据库写入数据并清理缓存。
如前提及的,以高并发业务系统为例,为了提高系统的QPS(每秒查询率) 与RT(响应时间),通常会针对读多写少的业务数据设置缓存。通常数据库发生写操作时,需要及时清理缓存,从而保证数据一致性。然而,由于清理缓存与写DB不是原子性的,如果部分操作成功的话,还是会导致缓存状态与数据库状态不一致,例如:写DB成功但是清理缓存失败,这种情况下,就没有对缓存进行及时清理,从而对业务上造成影响。一种保证缓存一致性的方案是在 APP里显示清理缓存,如果清理失败,会兜底使用缓存超时来保证缓存与数据库的最终一致。然而,如果超时时间太短会影响缓存的命中率;如果缓存超时太长,则业务上不能接受。
本说明书实施例提出通过基于原子性的事务消息,来保证在写DB同时确保成功清理缓存,从而确保数据库状态发生变更时,缓存可以立即清理掉。这就使得将缓存超时时间设置的长一些变为可能,从而保证缓存的命中率。
第一方面,本说明书实施例提供一种缓存同步方法,用于在应用向数据库进行写数据操作时,对缓存中存储的所述应用相关的原数据进行清理。请参考图2,为本说明书实施例提供的缓存同步方法流程图,包括步骤S201-S203。
S201:应用第一设备向数据库发起写数据操作。
一般由当前APP所在设备向数据库发起写数据操作。例如,当前APP执行某些网络业务,发生了业务数据变更时,需要对DB进行写操作。本说明书实施例中,以“应用第一设备”表示当前APP所在的设备,为了区分,后续以“应用第二设备”、“应用第三设备”表示同一款APP所在的其他设备。需要说明的是,应用第一设备、应用第二设备、应用第三设备等都是APP所在的设备,一般是不同的物理设备,当然也不排除是同一个物理设备的可能。具体应用场景中,应用第一设备、应用第二设备、应用第三设备可以是用户操作的终端,也可以是网络设备,例如服务器。
S202:应用第一设备向应用第二设备发起写数据操作对应的事务消息。
为了在向数据库进行写数据过程中,保证对缓存进行成功清理,本说明书实施例采用基于原子性的事务消息,从而告知应用第二设备进行缓存清理。
事务,是并发控制的单位,可以理解为访问数据库时一系列的逻辑相关动作。比如,列车订票系统中,选择目的地(或车次)、选择日期和时间、选择作为、出票和付款,这一系列的业务处理构成一个事务。事务消息,是一种基于分布式系统下,可以与数据库写数据事务保证原子性的消息。订阅方收到事务消息后,可以确定发送方的业务一定是成功的。如果订阅方没有收到消息,则可以确定业务一定没有提交或已经被回滚。
可以理解,本说明书实施例中,应用第一设备作为发送方、应用第二设备作为订阅方,二者之间传递有关写数据操作对应的事务消息。当应用第一设备执行完S201步骤之后,即向数据库发起写数据操作之后,就向应用第二设备发起写数据操作对应的事务消息,以通知应用第二设备对缓存相关原数据进行清理。事务消息中可携带缓存清理标识,用以告知应用第二设备对哪一部分数据进行清理。
S203:当应用第二设备接收到事务消息之后,根据事务消息中的缓存清理标识,请求对缓存中的原数据进行清理。
应用第二设备如果接收到事务消息,根据之前对事务消息的理解,则说明与该事务消息具有原子性关系的写数据操作成功了,因此,此时需要执行该事务消息对应的操作,即,对缓存中的原数据进行清理。具体的,可根据事务消息中携带的缓存清理标识,从缓存中确定出待清理的具体数据,然后向缓存发送删除这部分数据的请求。
通过本说明书实施例提供的缓存同步方法,用于在应用向数据库进行写数据操作时,基于原子性的事务消息,对缓存中存储的所述应用相关的原数据进行清理,可避免数据库写成功而缓存清理的失败的情况(事务消息的原子性,保证了接收到事务消息的应用第二设备执行缓存清理的操作),可以保证缓存数据的有效性。
参见图3,本说明书实施例第一方面提供的缓存同步方法实例实现示意图。在该实施例中,增加描述了通过应用第一设备对缓存进行同步清理、以及通过消息中间件在不同的应用设备之间转发事务消息的方式。
图3中,以应用第一设备向DB写链路(写数据)操作为背景,示意出了在写数据过程中,首先利用应用第一设备对缓存进行同步清理,以及一旦缓存同步清理失败的情况下,也可以确保通过事务消息来通知应用第二设备(或应用第三设备等)进行缓存清理的方式。
S301:应用第一设备向数据库发起写数据操作。
S302:应用第一设备请求对缓存中的原数据进行同步清理。
应用第一设备写完DB后,尝试去同步清理缓存状态。如果清理失败,也可以忽略(由后续事务消息保证清理成功)。
S303:应用第一设备向消息中间件发送写数据操作对应的事务消息。
步骤S301与S303保证是原子操作。当S301写操作失败时,S303的事务消息会被回滚(撤销)。事务消息内容可以推断出缓存标识(key)信息。
S304:消息中间件确定出与应用第一设备具有应用关联的应用第二设备,并将事务消息转发给应用第二设备。
消息中间件,可以是指分布式系统中用于数据中转的网络设备,可以理解为一个集群的中转设备。当前APP所在的不同设备(应用第一设备、应用第二设备、应用第三设备等)可以认为是一个集群,消息中间件可以联通各个应用设备。消息中间件接收到应用第一设备的事务消息后,通过应用第一设备所在集群的信息,确定出与应用第一设备具有应用关联的应用第二设备,并将事务消息转发给应用第二设备。
S305:应用第二设备根据事务消息,请求对缓存中的原数据进行清理。
为了确保根据事务消息一定能成功地对缓存进行清理,消息中间件还可以监控是否清理成功。
例如,在一种可选方式中,在上述步骤S304之后,消息中间件会接收应用第二设备的反馈,确认应用第二设备是否成功清理所述缓存。如果清理成功,则结束流程,如果清理失败,消息中间件则继续转发该事务消息给下一个应用设备。即,若应用第二设备未成功清理缓存,消息中间件确定出与应用第一设备具有应用关联的应用第三设备,并将事务消息转发给应用第三设备,以便应用第三设备请求对缓存中的原数据进行清理。可以理解,在应用第三设备反馈清理失败的情况下,可以继续转发给应用第四设备,以此类推,直至清理成功为止。
在消息中间件向应用相关设备转发事务消息过程中,可复用当前业务消息进行,从而节省开销。在一种可选方式中,消息中间件确定应用第二设备或应用第三设备以及转发事务消息的具体方式可以为:
(1)消息中间件根据当前业务,确定出与自身有业务消息传递的设备;
(2)从与自身有业务消息传递的设备中,选择出与应用第一设备具有应用关联的应用第二设备或应用第三设备;
其中,消息中间件复用业务消息,从而通业务消息向所述用第二设备或应用第三设备转发事务消息。
例如,假设消息中间件当前业务传输的设备包括设备1、2、…、10共十个设备,其中,设备2、设备5为当前应用所在设备,那么,就可以确定出设备 2为应用第二设备、设备5为应用第三设备,在转发事务消息时,通过复用当前业务消息,将事务消息发送给这两个设备,从而减少额外的消息传输开销。
可见,上述参考图3介绍的实施例中,首先通过应用第一设备对缓存进行同步清理,这种同步清理会尽可能保证清理的及时性,可以保证大部分没有清理异常情况下缓存与DB的强一致;并且,即使在同步清理失败的情况下,可通过与写数据具有原子性的事务消息,对缓存进一步清理,特别的,通过引入消息中间件,可将事务消息复用在当前业务消息中,在不额外占用开销的条件下完成转发给应用设备的目的,并且在清理失败的情况下,消息中间件可以重新投递事务消息,直至清理成功为止,保证缓存与DB的最终一致性。
第二方面,基于同一发明构思,本说明书实施例提供一种缓存同步控制装置,用于在应用向数据库进行写数据操作时,控制对缓存中存储的所述应用相关的原数据进行清理,所述装置位于应用第一设备中。请参考图4,该装置包括:
写数据操作发起单元401,用于向数据库发起写数据操作;
事务消息发送单元402,用于向应用第二设备发起所述写数据操作对应的事务消息,以便所述应用第二设备根据所述事务消息请求对缓存中的原数据进行清理。
在一种可选方式中,该装置还包括:
同步清理单元403,用于在发起写数据操作之后,请求对缓存中的原数据进行同步清理。
在一种可选方式中,还包括:
事务消息回滚单元404,用于确定所述写数据操作失败时,对所述事务消息进行回滚操作。
在一种可选方式中,所述事务消息发送单元402具体用于,向消息中间件发送所述写数据操作对应的事务消息,从而通过所述消息中间件将所述事务消息转发给所述应用第二设备。
第三方面,基于同一发明构思,本说明书实施例提供一种缓存同步控制系统,用于在应用向数据库进行写数据操作时,控制对缓存中存储的所述应用相关的原数据进行清理,请参考图5,该系统包括:应用第一设备501、应用第二设备502、数据库503及缓存504,其中:
所述应用第一设备501,用于向数据库503发起写数据操作,并向应用第二设备502发起所述写数据操作对应的事务消息;
所述应用第二设备502,用于在接收到所述事务消息之后,根据所述事务消息中的缓存清理标识,请求对缓存504中的原数据进行清理。
在一种可选方式中,所述应用第一设备501还用于,请求对缓存中的原数据进行同步清理。
在一种可选方式中,所述应用第一设备501还用于,确定所述写数据操作是否成功,若写数据操作失败,对所述事务消息进行回滚操作。
在一种可选方式中,所述系统还包括消息中间件505;
所述消息中间件505,用于接收所述应用第一设备501发送的所述写数据操作对应的事务消息,并确定出与所述应用第一设备501具有应用关联的应用第二设备502,以及将所述事务消息转发给所述应用第二设备502,以便所述应用第二设备502请求对缓存中的原数据进行清理。
在一种可选方式中,所述系统还包括应用第三设备506;
所述消息中间件505还用于,确认所述应用第二设备502是否成功清理所述缓存;若所述应用第二设备502未成功清理所述缓存,确定出与所述应用第一设备501具有应用关联的应用第三设备506,并将所述事务消息转发给所述应用第三设备506;
所述应用第三设备506,用于在接收到所述事务消息之后,请求对缓存504 中的原数据进行清理。
在一种可选方式中,所述消息中间件505还用于,根据当前业务,确定出与自身有业务消息传递的设备,并从所述与自身有业务消息传递的设备中,选择出与所述应用第一设备501具有应用关联的应用第二设备502或应用第三设备506;其中,所述消息中间件505复用所述业务消息,从而通过所述业务消息向所述应用第二设备502或应用第三设备506转发所述事务消息。
第四方面,基于与前述实施例中缓存同步控制方法同样的发明构思,本发明还提供一种服务器,如图6所示,包括存储器604、处理器602及存储在存储器604上并可在处理器602上运行的计算机程序,所述处理器602执行所述程序时实现前文所述缓存同步控制方法的任一方法的步骤。
其中,在图6中,总线架构(用总线600来代表),总线600可以包括任意数量的互联的总线和桥,总线600将包括由处理器602代表的一个或多个处理器和存储器604代表的存储器的各种电路链接在一起。总线600还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路链接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口606在总线600和接收器601和发送器603之间提供接口。接收器601和发送器603 可以是同一个元件,即收发机,提供用于在传输介质上与各种其他装置通信的单元。处理器602负责管理总线600和通常的处理,而存储器604可以被用于存储处理器602在执行操作时所使用的数据。
第五方面,基于与前述实施例中缓存同步控制方法的发明构思,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前文所述缓存同步控制方法的任一方法的步骤。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和 /或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的设备。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令设备的制造品,该指令设备实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本说明书的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本说明书范围的所有变更和修改。
显然,本领域的技术人员可以对本说明书进行各种改动和变型而不脱离本说明书的精神和范围。这样,倘若本说明书的这些修改和变型属于本说明书权利要求及其等同技术的范围之内,则本说明书也意图包含这些改动和变型在内。