具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
例如,参见图1,为本申请实施例提供的一种实现数据库写访问的方法流程示意图。如图1所示,该方法可以包括:
S110、响应于接收到向数据库写入数据的请求,生成用于在缓存中唯一标识所述数据的缓存主键,将由所述缓存主键标识的所述数据写入所述缓存。
一些可能的实施方式中,所述数据库可以为有多个分库的数据库。在该实施方式中,步骤S110生成的缓存主键可以包含用于确定分库的指定信息。例如,所述缓存主键可以根据UUID(UniversallyUniqueIdentifier,全球唯一标识)以及用于确定分库的指定信息生成缓存主键。其中,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。例如,一些可能的实施方式中,数据库可以根据用户ID信息划分各个分库,则所述用于确定分库的指定信息可以为用户ID。例如,所述缓存主键可以由为所述数据生成的UUID以及提交该数据的用户的用户ID拼接而成。
可以理解的是,本申请实施例适于应用于具有多个分库的数据库,但并不仅限于此,本申请实施例也可以应用于单库的数据库。还需要说明的是,本申请实施例所述缓存可以是基于任意框架的数据库缓存,例如分布式数据库缓存等。
S120、当所述数据库可用时,从缓存中取得所述缓存主键标识的数据,生成用于在所述数据库中唯一标识所述数据的库主键,将由所述库主键标识的所述数据写入所述数据库。
一些可能的实施方式中,本申请实施例还可以向发出所述请求的请求侧反馈所述缓存主键。请求侧得到该缓存主键后,可以根据自身的请求侧运行规则,在需要对该数据进行操作时,针对该缓存主键标识的数据发出操作指令。因此,本申请实施例还可以响应于接收到所述请求侧的操作指令,对所述操作指令携带的缓存主键所标识的数据执行相应操作。例如,操作指令可以包括删除数据、读取数据,修改数据等等。
例如,可以响应于接收到请求侧的操作指令,对所述缓存中所述缓存主键标识的数据执行相应操作。具体地,例如,可以响应于接收到请求侧的读操作指令,如果所述读操作指令携带的缓存主键标识的数据存在于所述缓存中,从所述缓存中读取出所述缓存主键标识的数据。更近一步地,还可以将读取出的数据反馈给请求侧。
再例如,本申请实施例在得到所述数据的库主键之后,还可以将所述数据的缓存主键与所述数据的库主键绑定。在该实施方式中,可以响应于接收到请求侧的操作指令,对所述数据库中由所述缓存主键绑定的库主键所标识的数据执行相应操作。
更具体地,例如,可以响应于接收到请求侧的读操作指令,如果所述读操作指令携带的缓存主键标识的数据未存在于所述缓存中,从所述数据库中读取出由所述缓存主键绑定的库主键所标识的数据。和/或者,响应于接收到请求侧的删除操作指令,从所述数据库中删除所述删除操作指令携带的缓存主键绑定的库主键所标识的数据。和/或者,响应于接收到请求侧的修改操作指令,对所述数据库中所述修改操作指令携带的缓存主键绑定的库主键所标识的数据执行相应修改操作。另外,如果所述删除命令携带的缓存主键标识的数据存在于所述数据库缓存中,从所述数据库缓存中删除所述删除命令携带的缓存主键标识的数据,以及,还可以相应删除所述缓存主键与库主键之间的绑定。
需要说明的是,本申请实施例提供的方法可以应用于任意架构的数据库访问系统中能够访问缓存的服务器侧。例如,在本申请实施例一些可能的实施方式中,数据库访问系统可以包括用户终端侧、业务服务器侧、缓存侧、数据库。其中,业务服务器侧、缓存侧以及数据库可以部署在相同或不同的服务器上,本申请对此并不进行限制。例如,在该实施方式中,本申请实施例提供的方法可以应用于业务服务器侧,其中,发出所述请求的请求侧可以为用户终端侧。再例如,本申请实施例提供的方法可以应用于与业务服务器侧及缓存侧有所区别的访问服务器侧,其中,发出所述请求的请求侧可以为业务服务器侧或用户终端侧。又例如,本申请实施例提供的方法可以应用于缓存侧,其中,发出所述请求的请求侧可以为业务服务器侧或用户终端侧。
可见,由于本申请实施例在收到请求侧向数据库写入数据的请求时,无需生成用于在数据库中使用的库主键,而是生成用于在缓存中唯一标识所述数据的缓存主键,该缓存主键即相当于该数据在缓存中的路由,从而可以将由该缓存主键标识的该数据写入缓存,即使在接收到写入数据请求时数据库不可用,也不会发生写访问失败。当数据库可用时,可以再生成用于在所述数据库中唯一标识所述数据的库主键,从缓存中取得所述缓存主键标识的数据,将该数据由所述库主键标识并写入数据库。因此,本申请实施例实现的数据库写访问降低了对数据库的依赖性,达到了提高业务可用性的目的。
可以理解的是,在上面提到的具有多个分库的数据库的实施方式中。所述具有多个分库的数据库,可以是对一个单独数据库进行分库分表之后得到的具有多个分库的数据库。由于具有多个分库的数据库在其中部分分库故障时,仍然还有其他可用的分库,因此,部分可用的数据库的业务仍然可以运行,一定程度上可以提高业务的可用性。因此,目前大型互联网应用的数据库通常为具有多个分库的数据库。但是,当数据库中用于维护全局唯一标识的数据表不能使用时,将导致所有业务的写访问都受到影响,因此,本申请实施例可以解决大型互联网应用对数据库的强依赖,即使所有的数据库不可用,也不会发生写访问失败,分库可用的业务仍然可以正常运行。
下面,以本申请实施例所述数据库为有多个分库的数据库为例,对本申请实施例一种可能的实施方式进行详细说明。例如,参见图2,该实施方式可以包括:
S210、响应于接收到请求侧向数据库写入数据的请求,为所述数据生成唯一标识该数据的UUID,根据所述UUID以及用于确定分库的指定信息生成所述缓存主键。
例如,一些可能的实施方式中,如图3所示,本申请实施例提供的方法可以应用于访问服务器侧320,其中,发出所述请求的请求侧可以为支付业务服务器侧310。访问服务器侧320可以与支付业务服务器侧310进行交互。当用户访问支付业务服务器侧310的网站做支付时,如果支付业务服务器侧310对支付数据验证通过,如图3所示,访问服务器侧320可以接收到支付业务服务器侧310发出的向数据库340写入支付数据的请求。在接收到该请求之后,所述访问服务器侧320可以为该支付数据生成UUID,并将该UUID与所述用户的用户ID拼接,生成该支付数据的缓存主键。
S220、将由所述缓存主键标识的所述数据写入所述缓存,以及,将所述数据在缓存中的版本标识设置为第一版本标识。
例如,结合上面支付的实施方式,如图3所示,所述访问服务器侧320可以将该支付数据写入缓存侧330,并将该支付数据在缓存侧330中的版本标识设置为0(即,第一版本标识),以表示该支付数据需要被写入到数据库340中。可以理解的是,对于缓存侧330中版本标识为非0的数据则无需写入到数据库340中。
再例如,如图3所示,在所述访问服务器侧320将支付数据写入缓存侧330之后,还可以向支付业务服务器侧310反馈写入成功的消息,以及反馈该支付数据的缓存主键,以便支付业务服务器侧310后续通过该缓存主键访问该支付数据。支付业务服务器侧310在接收到写入成功的消息后,还可以相应向用户反馈支付成功的消息。可见,即使数据库340此时不可用,支付业务服务器侧310也可以成功进行写访问。
S230、当所述数据库可用时,启动异步程序查询所述缓存中是否存在带有第一版本标识的数据。
例如,如图3所示,所述访问服务器侧320可以启动自身的一个或多个异步程序并行来查询所述缓存侧330中是否存在版本标识为0的数据。
S240、如果存在,所述异步程序从缓存中读取出由所述缓存主键标识的、带有第一版本标识的数据,从所述数据库用于维护全局唯一标识的数据表获得为该数据生成的序列号,根据库主键格式要求以及获得的序列号生成该数据的库主键。
例如,如图3所示,所述访问服务器侧320启动的异步程序可以从缓存侧330中读取出版本标识为0的数据,从数据库340获得序列号,根据序列号以及数据库的库主键的格式要求进一步生成该数据的库主键。
S250、所述异步程序将由所述库主键标识的所述数据写入其缓存主键包含的指定信息所确定的分库。
S260、所述异步程序在所述数据写入所述分库后,将所述数据在所述缓存中的版本标识设置为第二版本标识。
例如,如图3所示,所述异步程序可以将由所述库主键标识的所述数据写入其缓存主键包含的指定信息所确定的分库,并从数据库接收其返回的是否写入成功的结果,并更新所述数据在缓存侧330中的版本标识为1。
可见,本申请实施例提供了一种解决分库模式下库主键异步生成的策略,针对请求侧发出的写数据请求,根据UUID以及用于确定分库的指定信息生成缓存主键,将由缓存主键标识的数据暂时写入缓存,缓存主键的生成无需依赖数据库,同时又可以保证在数据库可用的情况下,由异步程序生成库主键以及将数据正常写入数据库,从而解决了大型互联网应用对数据库的强依赖,即使所有的数据库不可用,也不会发生写访问失败,分库可用的业务仍然可以正常运行,极大的提高了互联网应用的可用性。
与上述实现数据库写访问的方法相对应,本申请实施例还提供了一种实现数据库写访问的装置。
例如,参见图4,为本申请实施例提供的一种实现数据库写访问的装置结构示意图。如图4所示,该装置可以包括:
写入缓存单元410,可以用于响应于接收到向数据库写入数据的请求,生成用于在缓存中唯一标识所述数据的缓存主键,将由所述缓存主键标识的所述数据写入所述缓存。写入数据库单元420,可以用于当所述数据库可用时,从缓存中取得所述缓存主键标识的数据,生成用于在所述数据库中唯一标识所述数据的库主键,将由所述库主键标识的所述数据写入所述数据库。
可见,由于本申请实施例的写入缓存单元410在收到例如请求侧向数据库写入数据的请求时,无需生成用于在数据库中使用的库主键,而是生成用于在缓存中唯一标识所述数据的缓存主键,该缓存主键即相当于该数据在缓存中的路由,从而可以将由该缓存主键标识的该数据写入缓存,即使在接收到写入数据请求时数据库不可用,也不会发生写访问失败。而且写入数据库单元420当数据库可用时,可以再生成用于在所述数据库中唯一标识所述数据的库主键,从缓存中取得所述缓存主键标识的数据,将该数据由所述库主键标识并写入数据库。因此,本申请实施例实现的数据库写访问降低了对数据库的依赖性,达到了提高业务可用性的目的。
一些可能的实施方式中,该装置还可以包括:反馈单元430,可以用于向发出所述请求的请求侧反馈所述缓存主键。操作单元440,可以用于响应于接收到所述请求侧的操作指令,对所述操作指令携带的缓存主键所标识的数据执行相应操作。
结合上面的实施方式中,该装置还可以包括:绑定单元450,可以用于将所述数据的缓存主键与所述数据的库主键绑定。相应地,所述操作单元440可以包括:缓存操作子单元441,可以用于响应于接收到请求侧的操作指令,对所述缓存中所述缓存主键标识的数据执行相应操作。和/或者,数据库操作子单元442,可以用于响应于接收到请求侧的操作指令,对所述数据库中由所述缓存主键绑定的库主键所标识的数据执行相应操作。
例如,其中,所述缓存操作子单元441,可以用于响应于接收到请求侧的读操作指令,如果所述读操作指令携带的缓存主键标识的数据存在于所述缓存中,从所述缓存中读取出所述缓存主键标识的数据。
再例如,其中,所述数据库操作子单元442,可以包括:读取子单元4420,可以用于响应于接收到请求侧的读操作指令,如果所述读操作指令携带的缓存主键标识的数据未存在于所述缓存中,从所述数据库中读取出由所述缓存主键绑定的库主键所标识的数据。和/或者,删除子单元4421,可以响应于接收到请求侧的删除操作指令,从所述数据库中删除所述删除操作指令携带的缓存主键绑定的库主键所标识的数据。和/或者,修改子单元4422,可以用于响应于接收到请求侧的修改操作指令,对所述数据库中所述修改操作指令携带的缓存主键绑定的库主键所标识的数据执行相应修改操作。
一些可能的实施方式中,所述数据库可以为有多个分库的数据库。在该实施方式中,所述写入缓存单元410,具体可以用于为所述数据生成唯一标识该数据的UUID,根据所述UUID以及用于确定分库的指定信息生成所述缓存主键。且,还可以包括,版本设置单元460,可以用于在所述写入缓存单元将所述数据写入所述缓存之后,将所述数据在缓存中的版本标识设置为第一版本标识。相应地,所述写入数据库单元420可以包括:数据获取子单元421,可以用于当所述数据库可用时,启动异步程序从所述缓存中读取出由所述缓存主键标识的、带有第一版本标识的数据。库主键生成子单元422,可以用于从所述数据库用于维护全局唯一标识的数据表获得为该数据生成的序列号,根据库主键格式要求以及获得的序列号生成该数据的库主键。写入子单元423,可以用于将由所述库主键标识的所述数据写入其缓存主键包含的指定信息所确定的分库。且,该装置还可以包括版本更改单元461,可以用于在所述数据写入所述分库后,将所述数据在所述缓存中的版本标识设置为第二版本标识。
在上面的实施方式中,写入缓存单元410针对请求侧发出的写数据请求,根据UUID以及用于确定分库的指定信息生成缓存主键,将由缓存主键标识的数据暂时写入缓存,缓存主键的生成无需依赖数据库,同时又可以保证在数据库可用的情况下,由写入数据库单元420启动异步程序生成库主键以及将数据正常写入数据库,从而解决了大型互联网应用对数据库的强依赖,即使所有的数据库不可用,也不会发生写访问失败,分库可用的业务仍然可以正常运行,极大的提高了互联网应用的可用性。
需要注意的是,本申请实施例的数据获取子单元421、库主键生成子单元422、写入子单元423、版本设置单元460、版本更改单元461、绑定单元450、操作单元440、缓存操作子单元441、数据库操作子单元442、读取子单元4420、删除子单元4421、修改子单元4422以及反馈单元430在图4中以虚线绘制,以表示这些单元不是本申请实施例提供的实现数据库写访问的装置的必要单元。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本申请可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本申请的较佳实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本申请的保护范围内。