发明内容
本申请实施例的目的是提供一种数据写入、读取方法及装置,以解决现有技术存在的在数据库扩容时所采取的数据迁移动作费时费力的问题。
为解决上述技术问题,本申请实施例提供的数据写入、读取方法及装置是这样实现的:
一种数据写入方法,包括:
接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
基于第一数据库的当前待写入数据的写入规则,确定与所述第一标识对应的存储位置信息;
确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库。
一种数据写入方法,包括:
接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
基于与第一数据库的第二存储空间对应的第二写入规则,确定与所述第一标识对应的存储位置信息;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的;
确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库的第二存储空间。
一种数据写入方法,包括:
接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
根据第一数据库的第二存储空间所存储的数据量,从与所述第二存储空间对应的第二写入规则、与所述第一数据库的全部存储空间对应的第三写入规则中选取一个写入规则;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的;
基于选取的写入规则,确定与所述第一标识对应的存储位置信息;
确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库。
一种数据读取方法,包括:
接收携带有待读取数据的数据读取请求;
获取与所述待读取数据对应的第二标识;
提取所述第二标识中包含的根据第一数据库的当前待读取数据的写入规则来确定的存储位置信息;
依据所述存储位置信息进行路由,并按照所述路由的结果从所述第一数据库中读取所述待读取数据。
一种数据写入装置,包括:
请求接收模块,用于接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
信息确定模块,用于基于第一数据库的当前待写入数据的写入规则,确定与所述第一标识对应的存储位置信息;
标识生成模块,用于确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
数据写入模块,用于依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库。
一种数据写入装置,包括:
请求接收模块,用于接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
信息确定模块,用于基于与第一数据库的第二存储空间对应的第二写入规则,确定与所述第一标识对应的存储位置信息;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的;
标识生成模块,用于确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
数据写入模块,用于依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库的第二存储空间。
一种数据写入装置,包括:
请求接收模块,用于接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
规则选取模块,用于根据第一数据库的第二存储空间所存储的数据量,从与所述第二存储空间对应的第二写入规则、与所述第一数据库的全部存储空间对应的第三写入规则中选取一个写入规则;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的;
信息确定模块,用于基于选取的写入规则,确定与所述第一标识对应的存储位置信息;
标识生成模块,用于确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
数据写入模块,用于依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库。
一种数据读取装置,包括:
请求接收模块,用于接收携带有待读取数据的数据读取请求;
标识获取模块,用于获取与所述待读取数据对应的第二标识;
信息提取模块,用于提取所述第二标识中包含的根据第一数据库的当前待读取数据的写入规则来确定的存储位置信息;
数据读取模块,用于依据所述存储位置信息进行路由,并按照所述路由的结果从所述第一数据库中读取所述待读取数据。
由以上本申请实施例提供的技术方案可见,本申请实施例在写入所述待写入数据的过程中,根据相应的写入规则确定与待写入数据的第一标识对应的存储位置信息,并根据该存储位置信息及上述第一标识,得到一个与待写入数据关联的第二标识。因为该第二标识中直接包含待写入数据的存储位置信息,从而使得数据读取过程可以无需根据上述待写入数据在写入过程所采取的写入规则来计算待读取数据的存储位置信息,也就是说,无论数据库的写入规则是否变更,都无需变更该数据库的读取规则,即读取规则始终是依据上述第二标识来确定待读取数据的存储位置信息。基于上述原因,本申请实施例在数据库需要扩容时无需采取数据迁移方式,从而降低数据库维护的难度及成本。
具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
本申请实施例中所述及的数据库可以是物理上构建在一起的若干存储单元,也可以是物理上分离的若干存储单元的集合。所述方法的执行主体可以是数据库服务器。
图3为本申请第一实施例中数据写入方法的流程图。本实施例中,上述数据写入方法包括:
S101:接收携带有待写入数据及该待写入数据的第一标识的数据写入请求。
数据库服务器可以通过接收终端发送的某个待写入数据的数据写入请求,来触发将该待写入数据写入到数据库的存储单元中的动作。所述终端可以是电脑、手机等。当然,所述数据写入请求也可以是来自于其他服务器。
每个待写入数据均对应一个预设的唯一第一标识id。在业务的发展过程中,根据数据量的大小,相应地给每个待写入数据分配一个第一标识id。如:某个网站有100万个注册用户,则相应地为这100万个注册用户分别分配0000001-1000000的第一标识id。在数据库写入及读取过程中,每个数据均会携带业务系统为其预先分配的第一标识id。
S102:基于第一数据库的当前待写入数据的写入规则,确定与第一标识对应的存储位置信息。
本申请实施例中,所述写入规则包括分库规则和分表规则,所述存储位置信息包括分库信息和分表信息,则上述步骤S102具体包括:基于第一数据库的当前待写入数据的分库规则,确定与第一标识对应的分库信息;基于第一数据库的当前待写入数据的分表规则,确定与第一标识对应的分表信息。
第一数据库是上述数据库服务器执行数据写入操作的目标数据库。根据第一数据库所需存储的数据量,将上述第一数据库切分成多个子库,每个子库又切分成多个数据表,例如:假设上述第一数据库所需存储数据量达到了108个,将第一数据库切分成100个子库,子库的编号可以是000-099,将每个子库切分成10个数据表,数据表的编号可以是00-09,则最终每个子库需要存放106个数据,每个数据表需要存放105个数据。
基于上述预先切分的数据库,依据相应的分库分表规则(即写入规则)来确定某个待写入数据应该写入上述第一数据库中的存储位置,也就是应该写入第一数据库中哪个子库下的哪个数据表中,上述存储位置通过存储位置信息来表征。具体地,本申请实施例中,分库分表规则包括分库规则和分表规则,相应地存储位置信息也包括分库信息(子库的编号)和分表信息(子库下某个数据表的编号)。
值得一提的是,若上述第一数据库只是切分成若干个子库,而并没有将各个子库切分成多个数据表(即每个子库只包含一张数据表),那么上述分库分表规则可能只是分库规则,相应地,上述存储位置信息也只是分库信息。
具体地,上述确定与第一标识id对应的分库信息的步骤包括:
将第一标识id对第一数据库的子库数量进行取模,并将取模的结果确定为分库信息。
上述确定与第一标识id对应的分表信息的步骤包括:
将第一标识id对第一数据库中每个子库下的数据表数量进行取模,并将取模的结果确定为分表信息。
假设a是上述第一数据库所切分的子库数量,b是第一数据库中的每个子库下所切分的数据表数量,则上述分库规则是:id%a,上述分表规则是:id%b。举例而言,若第一数据库切分成100个子库,则分库规则可以是id%100,若每个子库切分成10个数据表,则分表信息可以是id%10。假设待写入数据的第一标识id是:2920303010202030112,则通过分库规则id%100计算得到与该id对应的分库信息是:012;通过分表规则id%10计算得到与该id对应的分表信息是:02。
当然,在申请其他实施例中,分库规则和分表规则均可以是id%100,将id%100所得到的余数值确定为分库信息,将id%100所得到的商值的末位、或商值的末两位(具体根据数据表的数量来确定)确定为分表信息。据此,若待写入数据的第一标识id是:2920303010202030112,则通过分库规则id%100计算得到与该id对应的分库信息(余数值)是:012;通过分表规则id%100计算得到与该id对应的分表信息(商值的末位)是:01。
上述分库规则或分表规则也可以是其他规则,例如:根据待写入数据的id中的某个字段的数值来确定相应的分库信息或分表信息,例如:若待写入数据的第一标识id中的末三位的数值是001,则分入编号为001的子库中;若待写入数据的第一标识id中末位的数值是002,则分入编号为002的子库中;等等。
参照图4所示,其为本申请第一实施例中第一数据的数据结构示意图。上述第一数据库40包括扩容前的第一存储空间41和扩容后所增加的第二存储空间42,假设第一存储空间41被切分成100个子库:{part0DB、part1DB、……、part99DB},编号是000-099,每个子库被切分成10个数据表:{Table0、Table1、……、Table9},编号是00-09。假设第二存储空间42也被切分成100个子库:{part100DB、part101DB、……、part199DB},编号是100-199,每个子库被切分成10个数据表:{Table0、Table1、……、Table9},编号是00-09。
在数据库扩容前后,上述第一数据库40的写入规则是不一样的。例如,扩容之前,可以按照扩容前的写入规则(分库规则id%100,分表信息id%10)来计算各个待写入数据的存储位置信息,而在扩容之后,为了平衡数据库中的数据量,需要按照扩容后的写入规则(分库规则id%200,分表信息id%10)来计算接下来需要写入的数据的存储位置信息。基于此,在接收到待写入数据的数据写入请求之后,会判断当前数据写入请求所处的阶段是扩容前还是扩容后,来确定相应的写入规则。
S103:确定包含第一标识及存储位置信息的第二标识,并建立待写入数据到第二标识的映射关系。
基于上述步骤S102所得到的存储位置信息(分库信息和分表信息),可以确定一个与待写入数据关联的第二标识。本实施例中,可以通过在上述第一标识id中的某个特定位置插入上述计算得到的分库信息和分表信息,来得到与该待写入数据相关联的第二标识,该第二标识是下述数据读取过程的路由依据。
继续参照图4,假设待写入数据100的第一标识(id)是:344567890199,因为该待写入数据100是写入到第一存储空间41内的数据(扩容前),则通过扩容前的写入规则(分库规则id%100,分表信息id%10)计算得到与该id对应的分库信息是:099,分表信息是:09。若将上述分库信息及分表信息插入到上述id的前5位,即前1-3位是分库信息,前4-5位是分表信息,则最终得到该待写入数据100的第二标识是:09909344567890199。同理,假设另一个待写入数据200的第一标识(id)是:13933310899,并且该待写入数据200是写入到第二存储空间42内的数据(扩容后),则通过扩容后的写入规则(分库规则id%200,分表信息id%10)计算得到与该id对应的分库信息是:099,分表信息是:09,则最终得到该待写入数据200的第二标识是:0990913933310899。当然,分库信息和分表信息可以插入到上述id的其他位置,需要预先约定好即可。此外,上述分库信息和分表信息也可以分开插入到所述第一标识id中的两个不同位置。
S104:依据上述存储位置信息进行路由,并按照路由的结果将待写入数据写入第一数据库。
路由是查找到与上述写入请求相应的子库、及子库下的数据表的过程。也就是说,在得到分库信息和分表信息后,即可以路由得到数据写入操作的路径,并基于该路径将待写入数据写入到相应的子库下的指定数据表中。由于路由为本技术领域内的公知技术,故在此不作赘述。
基于以上实施例的方法,数据写入操作是按照上述第二标识包含的存储位置信息来进行的,在数据写入操作完成后,在服务器需要从相应的数据库中读取数据时,需要根据待读取的数据所关联的第二标识中包含的存储位置信息,可以确定该待读取的数据被预先存放的位置。例如:某个数据的第二标识是:012022920303010202030112,则从该第二标识既可以确定该数据被写入到上述第一数据库中的编号为“012”的子库下的编号为“02”的数据表中了,从而完成该数据的读取操作。相较于现有技术,通过以上方案,无论写入规则(分库分表规则)作怎样的变更,其读取规则始终不需要作改变,比如:写入规则由id%100变更为id%200,其读取规则始终是按照每个数据所关联的第二标识中的分库信息及分表信息来确定数据存放的位置。正是因为上述方案,本申请实施例在第一数据库扩容时,无需将原先按照旧的写入规则写入到上述第一数据库中的旧数据,全部作迁移并按照新的写入规则重新写入到上述扩容后的第一数据库中,从而解决了在数据库扩容时所采取的数据迁移动作费时费力的问题,降低数据库维护的难度及成本。
图5为本申请第二实施例中数据写入方法的流程图。本实施例中,上述数据写入方法包括:
S201:接收携带有待写入数据及该待写入数据的第一标识id的数据写入请求。
S202:基于与第一数据库的第二存储空间对应的第二写入规则,确定与所述第一标识对应的存储位置信息;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的。
参图6所示,其为本申请第二实施例中第一数据库的数据结构示意图。本实施例中,因为数据库扩容的需求,原先的第一数据库40只包含第一存储空间41,假设该第一存储空间41预先被切分成若干个子库,并且每个子库也预先切分成若干个数据表。随着业务的发展,在上述第一存储空间41的存储容量不足或者存储的数据量达到一定数量级,需要进行数据库扩容时,该第一数据库40在原先的第一存储空间41的基础上增加了第二存储空间42,根据实际情况,该第二存储空间42也根据分库分表规则,切分成若干个子库,每个子库也预先切分成若干个数据表。举例而言,假设第一存储空间41被切分成100个子库:{part0DB、part1DB、……、part99DB},子库的编号可以是000-099,并将每个子库切分成10个数据表:{Table0、Table1、……、Table9},数据表的编号可以是00-09;假设第二存储空间42也是被切分成100个子库:{part100DB、part101DB、……、part199DB},子库的编号可以是100-199,并将每个子库切分成10个数据表:{Table0、Table1、……、Table9},数据表的编号也可以是00-09。
由于原先的第一存储空间41中已经存放一定数据量的数据,而增加的第二存储空间42中还是空的或者只是存放了少量的数据量。一般地,第二存储空间42被增加到第一数据库40中后,第一存储空间41并不是完全不能写入数据,然而为了实现两个存储空间的数据量的均衡,本申请实施例将随后需要写入的数据优先地存放到增加的第二存储空间42中。具体地,第一存储空间41对应配置有第一写入规则,该第一写入规则确保数据可以被写入到第一存储空间41下的某个子库内的某数据表中。第二存储空间42对应配置有第二写入规则,该第二写入规则确保数据可以被写入到第二存储空间42下的某个子库内的某数据表中。
本实施例中,上述步骤S202之前,所述方法还包括:
根据与第一存储空间41对应的第一写入规则、及第二存储空间42包含的子库数量和每个子库下的数据表数量,来确定与第二存储空间42对应的第二写入规则。
具体地,所述第一写入规则包括第一分库规则和第一分表规则,所述第二写入规则包括第二分库规则和第二分表规则;则确定与第二存储空间42对应的第二写入规则的步骤包括:
将第一分库规则与第二存储空间42包含的子库数量相加,得到第二分库规则;其中,第一分库规则是将第一标识对第一存储空间41的子库数量进行取模。
确定第二分表规则为将第一标识对第二存储空间42中每个子库下的数据表数量进行取模。
参图6所示,举例而言,如果第一存储空间41的第一写入规则是:第一分库规则id%100,第一分表规则id%10,则基于上述规则确定过程,第二写入规则可以是:第二分库规则id%100+100,第二分表规则id%10。则,如果待写入数据100的第一标识id是344567890199,并且该数据是第一数据库在扩容前需要被写入到第一存储空间41中的,则按照以上第一写入规则,得到该待写入数据100的分库信息是099,分表信息是09。同理,如果另一个待写入数据200的第一标识id是:13933310899,并且该数据是上述第一数据在扩容后需要被写入到第二存储空间42中的,则按照以上第二写入规则,得到该待写入数据200的分库信息是199,分表信息是09。
关于第二写入规则的确定方式,本申请并不限于上述情况。例如,通过判断待写入数据的第一标识id是否大于某个数值来决定应该写入第一存储空间还是第二存储空间,如待写入数据的第一标识id:10000001>10000000,则将该待写入数据写入第二存储空间,否则,将该待写入数据写入第一存储空间。
S203:确定包含第一标识及存储位置信息的第二标识,并建立待写入数据到第二标识的映射关系。
存储位置信息包括分库信息和分表信息,与上述第一实施例的内容类似,可以通过在上述第一标识id中的某个特定位置插入上述计算得到的分库信息和分表信息,来得到与该待写入数据相关联的第二标识,该第二标识是下述数据读取过程的路由依据。
S204:依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库的第二存储空间。
与上述第一实施例的内容类似,路由是查找到与上述写入请求相应的子库、及子库下的数据表的过程。也就是说,在得到分库信息和分表信息后,既可以路由得到数据写入操作的路径,并基于该路径将待写入数据写入到相应的子库下的指定数据表中。
本申请实施例在写入所述待写入数据的过程中,根据相应的写入规则确定与待写入数据的第一标识对应的存储位置信息,并根据该存储位置信息及上述第一标识,得到一个与待写入数据关联的第二标识。因为该第二标识中直接包含待写入数据的存储位置信息,从而使得数据读取过程可以无需根据上述待写入数据在写入过程所采取的写入规则来计算待读取数据的存储位置信息,也就是说,无论数据库的写入规则是否变更,都无需变更该数据库的读取规则,即读取规则始终是依据上述第二标识来确定待读取数据的存储位置信息。基于上述原因,本申请实施例在数据库需要扩容时无需采取数据迁移方式,从而降低数据库维护的难度及成本。
图7为本申请第三实施例中数据写入方法的流程图。本实施例中,所述数据写入方法,包括:
S301:接收携带有待写入数据及该待写入数据的第一标识id的数据写入请求。
S302:根据第一数据库的第二存储空间所存储的数据量,从与第二存储空间对应的第二写入规则、和与第一数据库的全部存储空间对应的第三写入规则中选取一个写入规则;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的。
继续参上述图6所示,本实施例是基于上述第二实施例的内容衍生出来的。上述全部存储空间的定义是第一数据库40中原先的第一存储空间41和增加的第二存储空间42之和。因为在实际运用过程中,为了实现数据库中每个子库、每个数据表中的数据量的平衡,在增加的第二存储空间42中所存储的数据量达到一定的级别,也就是说,第二存储空间42中的数据量与原先存放在第一存储空间41内的数据量相差无几时,则需要改变该第一数据库40的写入规则。
首先介绍各个写入规则的确定过程。本申请实施例中,第一写入规则是与第一存储空间41对应的,该第一写入规则可以包括第一分库规则和第一分表规则,所述第二写入规则可以包括第二分库规则和第二分表规则,所述第三写入规则可以包括第三分库规则和第三分表规则。在上述步骤S302之前,所述方法还包括:
a)根据与第一存储空间41对应的第一写入规则、及第二存储空间42包含的子库数量和每个子库下的数据表数量,确定与第二存储空间42对应的第二写入规则。
本申请实施例中,上述步骤a具体包括:
将第一分库规则与所述第二存储空间42包含的子库数量相加,得到所述第二分库规则;其中,所述第一分库规则是将所述第一标识对所述第一存储空间41的子库数量进行取模。
确定所述第二分表规则为将所述第一标识对所述第二存储空间42中每个子库下的数据表数量进行取模。
例如,假设第一存储空间41包含100个子库,每个子库包含10个数据表;假设第二存储空间42包含100个子库,每个子库包含10个数据表。则第一分库规则可以是id%100,第一分表规则可以是id%10,第二分库规则可以是id%100+100,第二分表规则可以是id%10。
b)根据所述第一数据库40包含的子库数量、每个子库下的数据表数量,确定与全部存储空间对应的第三写入规则。
本申请实施例中,上述步骤b具体包括:
确定第三分库规则为将第一标识id对全部存储空间的子库数量进行取模。
确定第三分表规则为将第一标识id对全部存储空间中每个子库下的数据表数量进行取模。
如前所述,假设第一存储空间包含100个子库,每个子库包含10个数据表;假设第二存储空间包含100个子库,每个子库包含10个数据表。则全部存储空间包括200个子库,每个子库包含10个数据表,则第三分库规则可以是id%200,第三分表规则可以是id%10。当然,若存在各个子库所切分的数据表的数量不一致的情况,则根据所需切分的子库下的数据表数量,相应地调整所述第三分表规则即可。
为了实现各个子库、各个数据库的数据平衡,上述步骤S302具体包括:
确定第二存储空间42所存储的数据量与第一存储空间41所存储的数据量的差值。
判断所述差值是否小于预设阈值;若是,则选取与全部存储空间对应的第三写入规则;若否,则选取与第二存储空间42对应的第二写入规则。
继续沿用上述例子,假设第一存储空间41中的每个子库的数据量大致是105个,每个数据表的数据量大致103,若设定预设阈值是100,则起初还是依据第二分库规则id%100+100和第二分表规则id%10来将数据写入到第二存储空间42中,并时刻获悉第二存储空间42中各个子库的数据量m及各个子库下的数据表的数据量n,计算获得的差值是|m-105|或|n-103|。若上述差值|m-105|或|n-103|大于100,则表明第二存储空间42的数据量还未达到与第一存储空间41的数据量接近的状态,仍需按照第二写入规则进入数据写入动作;反之,若上述差值|m-105|或|n-103|小于100,则表明第二存储空间42的数据量已经达到与第一存储空间41的数据量接近的状态,需采取第三写入规则(第三分库规则是id%200,第三分表规则是id%10)来将待写入数据均分地写入到第一数据库40中。当然,本申请其他实施例中,也可以通过判断第二存储空间42中的数据量是否到达某个预设值(如:105),来判定需要选取哪一种写入规则。
S303:基于选取的写入规则,确定与所述第一标识对应的存储位置信息。
例如,第一标识id是593029459025,所选取的写入规则是:第二分库规则id%100+100和第二分表规则id%10,则存储位置信息中的分库信息是125,存储位置信息中的分表信息是05。
S304:确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系。
S305:依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库。
上述步骤S304和步骤S305均与上述第一、第二实施例类似,可参照以上内容,在此不再赘述。
本实施例在数据库需要扩容时无需通过数据迁移方式,从而降低数据库维护的难度及成本。此外,本实施例还可以动态平衡第一存储空间和第二存储空间的数据量,以确保上述第一数据库的查询效率达到最佳。
图8为本申请实施例中数据读取方法的流程图。本申请实施例中,基于上述数据写入方法的数据读取方法,包括:
S401:接收携带有待读取数据的数据读取请求。
S402:获取与所述待读取数据对应的第二标识。
S403:提取所述第二标识中包含的根据第一数据库的当前待读取数据的写入规则来确定的存储位置信息。
S404:依据所述存储位置信息进行路由,并按照所述路由的结果从所述第一数据库中读取所述待读取数据。
基于该实施例中,在数据读取过程中,读取规则是依据在写入过程中生成的第二标识来确定该待读取数据的存储位置,所以无论在扩容时变更怎样的写入规则,均无需变更数据的读取规则,从而可以避免在数据库扩容时所作的数据迁移动作,降低数据库维护难度及成本,提高查询效率。
接下来介绍本申请实施例所提供的数据写入、读取装置。
图9为本申请一实施例中数据写入装置的模块示意图。本实施例中,所述数据写入装置,包括:
请求接收模块11,用于接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
信息确定模块12,用于基于第一数据库的当前待读取数据的写入规则,确定与所述第一标识对应的存储位置信息;
标识生成模块13,用于确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
数据写入模块14,用于依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库。
本申请实施例中,所述写入规则包括分库规则和分表规则,所述存储位置信息包括分库信息和分表信息,所述信息确定模块12包括:
分库信息确定单元,用于基于第一数据库的当前待读取数据的分库规则,确定与所述第一标识对应的分库信息;
分表信息确定单元,用于基于第一数据库的当前待读取数据的分表规则,确定与所述第一标识对应的分表信息。
本申请实施例中,所述分库信息确定单元用于:
将所述第一标识对所述第一数据库的子库数量进行取模,并将所述取模的结果确定为所述分库信息;
所述分表信息确定单元用于:
将所述第一标识对所述第一数据库中每个子库下的数据表数量进行取模,并将所述取模的结果确定为所述分表信息。
本申请另一实施例中,所述数据写入装置包括:
请求接收模块11,用于接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
信息确定模块12,用于基于与第一数据库的第二存储空间对应的第二写入规则,确定与所述第一标识对应的存储位置信息;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的;
标识生成模块13,用于确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
数据写入模块14,用于依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库的第二存储空间。
本申请实施例中,所述装置还包括:
规则确定模块,用于根据与第一存储空间对应的第一写入规则、及第二存储空间包含的子库数量和每个子库下的数据表数量,确定与第二存储空间对应的第二写入规则。
本申请实施例中,所述第一写入规则包括第一分库规则和第一分表规则,所述第二写入规则包括第二分库规则和第二分表规则;则,所述规则确定模块包括:
分库规则确定单元,用于将第一分库规则与所述第二存储空间包含的子库数量相加,得到所述第二分库规则;其中,所述第一分库规则是将所述第一标识对所述第一存储空间的子库数量进行取模;
分表规则确定单元,用于确定所述第二分表规则为将所述第一标识对所述第二存储空间中每个子库下的数据表数量进行取模。
图10为本申请又一实施例中数据写入装置的模块示意图。本实施例中,该数据写入装置,包括:
请求接收模块11,用于接收携带有待写入数据及该待写入数据的第一标识的数据写入请求;
规则选取模块15,用于根据第一数据库的第二存储空间所存储的数据量,从与所述第二存储空间对应的第二写入规则、与所述第一数据库的全部存储空间对应的第三写入规则中选取一个写入规则;其中,所述第二存储空间是在第一数据库中的第一存储空间的基础上增加的;
信息确定模块12,用于基于选取的写入规则,确定与所述第一标识对应的存储位置信息;
标识生成模块13,用于确定包含所述第一标识及所述存储位置信息的第二标识,并建立所述待写入数据到所述第二标识的映射关系;
数据写入模块14,用于依据所述存储位置信息进行路由,并按照所述路由的结果将所述待写入数据写入所述第一数据库。
本申请实施例中,所述规则选取模块15包括:
差值确定单元,用于确定第二存储空间所存储的数据量与第一存储空间所存储的数据量的差值;
判断单元,用于判断所述差值是否小于预设阈值;
若是,则选取与全部存储空间对应的第三写入规则;
若否,则选取与第二存储空间对应的第二写入规则。
本申请实施例中,所述装置还包括:
第二规则确定单元,用于根据与第一存储空间对应的第一写入规则、及第二存储空间包含的子库数量和每个子库下的数据表数量,确定与第二存储空间对应的第二写入规则;
第三规则确定单元,用于根据所述第一数据库包含的子库数量、每个子库下的数据表数量,确定与全部存储空间对应的第三写入规则。
本申请实施例中,所述第一写入规则包括第一分库规则和第一分表规则,所述第二写入规则包括第二分库规则和第二分表规则,所述第三写入规则包括第三分库规则和第三分表规则;则,
所述第二规则确定单元用于:
将第一分库规则与所述第二存储空间包含的子库数量相加,得到所述第二分库规则;其中,所述第一分库规则是将所述第一标识对所述第一存储空间的子库数量进行取模;
确定所述第二分表规则为将所述第一标识对所述第二存储空间中每个子库下的数据表数量进行取模;
所述第三规则确定单元用于:
确定所述第三分库规则为将所述第一标识对所述全部存储空间的子库数量进行取模;
确定所述第三分表规则为将所述第一标识对所述全部存储空间中每个子库下的数据表数量进行取模。
图11为本申请一实施例中数据读取装置的模块示意图。本实施例中,所述数据读取装置,包括:
请求接收模块21,用于接收携带有待读取数据的数据读取请求;
标识获取模块22,用于获取与所述待读取数据对应的第二标识;
信息提取模块23,用于提取所述第二标识中包含的根据第一数据库的当前待读取数据的写入规则来确定的存储位置信息;
数据读取模块24,用于依据所述存储位置信息进行路由,并按照所述路由的结果从所述第一数据库中读取所述待读取数据。
基于以上内容,本申请实施例的数据写入装置在写入所述待写入数据的过程中,根据相应的写入规则确定与待写入数据的第一标识对应的存储位置信息,并根据该存储位置信息及上述第一标识,得到一个与待写入数据关联的第二标识。因为该第二标识中直接包含待写入数据的存储位置信息,从而使得数据读取装置可以无需根据上述待写入数据在写入过程所采取的写入规则来计算待读取数据的存储位置信息,也就是说,无论数据库的写入规则是否变更,都无需变更该数据库的读取规则,即读取规则始终是依据上述第二标识来确定待读取数据的存储位置信息。基于上述原因,本申请实施例在数据库需要扩容时无需采取数据迁移方式,从而降低数据库维护的难度及成本。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。