发明内容
本申请的主要目的为提供一种基于kafka和redis的数据同步方法、装置、设备和存储介质,旨在解决表数据同步的成本较高的技术问题。
为实现上述目的,本申请提供了一种基于kafka和redis的数据同步方法,包括以下步骤:
获取源表数据的操作类型、标识符rowid和所在的源数据表的表名;
根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中;
通过所述zset集合对应的线程从所述zset集合中获取所述表名和所述标识符rowid;
通过所述标识符rowid和所述表名获取所述源表数据,并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表。
进一步地,所述获取源表数据的操作类型、标识符rowid和所在的源数据表的表名的步骤之前,包括:
检测所述源表数据的操作类型是否为删除类型;
若是,将所述源表数据的行数据key-value组装成json文本;
将所述json文本放入预设的临时表,并生成对应的标识符rowid。
进一步地,所述调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表的步骤之后,包括:
计算所述redis数据库中用于数据同步的数据量;
将所述数据量与数据量阈值进行比较;
若所述数据量大于所述数据量阈值,调整所述kafka推送接口的推送频率。
进一步地,所述调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表的步骤之后,包括:
检测所述源表数据的推送是否成功;
若成功,删除所述redis数据库中写入的所述操作类型、标识符rowid和表名;
若不成功,保留所述redis数据库中写入的所述操作类型、标识符rowid和表名,并写入异常告警表。
进一步地,所述根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤,包括:
将所述标识符rowid转换为数字;
将所述数字除以所述zset集合的个数,得到对应的余数;
根据所述余数确定对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合。
进一步地,所述将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤,包括:
检测所述源表数据的操作类型是否为更新类型;
若是,获取所述源表数据的时间戳;
将所述源表数据的表名、操作类型、标识符rowid和时间戳写入所述redis数据库中对应的zset集合。
本申请还提供一种基于kafka和redis的数据同步装置,包括:
第一获取单元,用于获取源表数据的操作类型、标识符rowid和所在的源数据表的表名;
写入单元,用于根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中;
第二获取单元,用于通过所述zset集合对应的线程从所述zset集合中获取所述表名和所述标识符rowid;
推送单元,用于通过所述标识符rowid和所述表名获取所述源表数据,并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表。
进一步地,所述第一获取单元,包括:
第一检测子单元,用于检测所述源表数据的操作类型是否为删除类型;
组装子单元,用于若是,将所述源表数据的行数据key-value组装成json文本;
放入子单元,用于将所述json文本放入预设的临时表,并生成对应的标识符rowid。
本申请还提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时实现上述任一项所述的基于kafka和redis的数据同步方法的步骤。
本申请还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述的基于kafka和redis的数据同步方法的步骤。
本申请提供的基于kafka和redis的数据同步方法、装置、设备和存储介质,仅仅将源表数据的标识符rowid等关键字段写入到redis数据库中,很大程度上减少redis数据库的占用空间,节约成本,在数据推送时,直接根据标识符rowid去得到对应的源表数据,再通过kafka推送接口进行推送,能够快速的进行推送
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
参照图1,本申请一实施例提供了一种基于kafka和redis的数据同步方法,包括以下步骤:
步骤S1,获取源表数据的操作类型、标识符rowid和所在的源数据表的表名;
步骤S2,根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中;
步骤S3,通过所述zset集合对应的线程从所述zset集合中获取所述表名和所述标识符rowid;
步骤S4,通过所述标识符rowid和所述表名获取所述源表数据,并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表。
本实施例中,上述基于kafka和redis的数据同步方法应用在智能终端或服务器中,如上述步骤S1所述,上述操作类型包括更新(update)、插入(insert)和删除(delete),上述源表数据即在源数据表中进行操作的数据。每个源表数据都具有其对应的标识符rowid,标识符rowid是一种唯一标志记录物理位置的一个id,通过标识符rowid即可知道对应的源表数据的物理位置。
如上述步骤S2所述,redis数据库中预先设置有若干个zset集合,如预先设置20个zset集合,将表名、操作类型和标识符rowid写入到redis数据库中,即写入到redis数据库中的zset集合中。zset集合中value结构包括:表名、操作类型、标识符rowid。操作类型即上述的更新、插入、删除中的一种,可对应采用U/I/D表示。在另一实施例中,zset结构中还包括时间戳,时间戳记录的时间为源表数据进行操作时的时间,通过写入时间戳可保证多次更新操作中zset集合value值不重复,如多次更新操作,只会有一条更新操作的redis数据库值,所以使用时间戳拼接在value最后,用于保证值没有被覆盖。因此对于更新操作的源表数据,可将时间戳同时写入到redis数据库中。
如上述步骤S3所述,每个zset集合都有其对应的线程获取所述步骤S2写入的值,按照先进先出的原则进行获取,获取完成后加锁,防止重复获取,线程可采用单实例启动,每一分钟执行一次,每个线程处理1000可配置条数据,其中,线程处理的数据条数可由用户根据实际需要进行配置。
如上述步骤S4所述,线程从zset集合查询到标识符rowid和表名之后,根据表名确定源表数据所在的源数据表,再根据标识符rowid定位源表数据在源数据中的位置,并从源数据表中获取整条源表数据。当获取到源表数据后,调用kafka推送接口进行推送,根据操作类型进行数据推送,如源表数据的操作类型是插入类型,则将相应的源表数据插入至目标表中。使得源表数据能从源数据表中同步到目标表中。
kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。kafka可应用于日志收集,如通过kafka收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等;kafka还可应用于消息系统,用于解耦和生产者和消费者、缓存消息等;kafka还可应用于用户活动跟踪,用于记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘等。kafka具有高吞吐量、低延迟的特性:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition,consumer group对partition进行consume操作,即使在廉价的商用机器上也能做到单机支持每秒100k条消息的传输,因此通过kafka推送接口能够快速的将源表数据传输到有序的缓存库中,redis数据库是一个高性能的key-value数据库,但由于redis数据库的价格昂贵,因此仅仅将源表数据的标识符rowid等关键字段存储在redis数据库中,可以很大程度的节省redis数据库的费用,且redis数据库可支持跨数据库之间的数据同步。上述目标表是指想要将数据同步至其中的一个数据表,目标表和源数据表可以存储在一个数据库中,也可以分别存储在一个数据库中,当目标表和源数据表分别存储在一个数据库时,通过本实施例提供的基于kafka和redis的数据同步方法可实现不同数据库之间的数据同步。
本实施例中,仅仅将源表数据的标识符rowid等关键字段写入到redis数据库中,无需将整个源表数据写入到redis数据库中,很大程度上减少redis数据库的占用空间,节约成本,在数据推送时,直接根据标识符rowid去得到对应的源表数据,再通过kafka推送接口进行推送,能够快速的进行推送。
在一实施例中,所述获取源表数据的操作类型、标识符rowid和所在的源数据表的表名的步骤S1之前,包括:
步骤S1A,检测所述源表数据的操作类型是否为删除类型;
步骤S1B,若是,将所述源表数据的行数据key-value组装成json文本;
步骤S1C,将所述json文本放入预设的临时表,并生成对应的标识符rowid。
本实施例中,当源表数据的操作类型为删除类型时,源表数据在源数据表中已经不存在,当后续进行数据推送时,无法再从源数据表中得到源表数据,因此需要将删除的源表数据存储下来以便于后续将源表数据同步到目标表中,本实施例将源表数据组装成json放入临时表的content字段列中,即使在后续推送失败后,也还能从临时表中获取源表数据,防止数据丢失。json是一种基于文本,独立于语言的轻量级数据交换格式,json没有附加的任何标记,在json中可作为对象处理,更便于进行交换数据。当想要数据同步时,直接根据标识符rowid在临时表中获取源表数据。当源表数据的操作类型为删除类型时,源表数据的表名则为临时表的表名。
在一实施例中,所述调用kafka推送接口将所述源表数据按照所述操作类型推送到目标的步骤S4之后,包括:
步骤S5,计算所述redis数据库中用于数据同步的数据量;
步骤S6,将所述数据量与数据量阈值进行比较;
步骤S7,若所述数据量大于所述数据量阈值,调整所述kafka推送接口的推送频率。
本实施例中,多个资源会使用redis数据库,数据同步是其中一个部分,正常的数据同步流程中,当kafka推送接口推送源表数据成功后,redis数据库中写入的标识符rowid、表名等会相应的删除,防止占用空间,数据量阈值可根据实际需要去进行设置,如500M,当用于数据同步的数据量大于数据量阈值后,表明源表数据很多都没有同步成功,说明在推送到目标表的过程存在问题,可能存在的问题是kafka推送接口的推送频率太低,导致很多源表数据的标识符rowid、表名等堆积在redis数据库中,占用空间,因此可以调整推送频率,将推送频率提高,加快推送速度。
进一步地,当推送频率调整以后,数据量仍然大于数据量阈值,则写入到异常告警表,以供用户排查异常原因。
在一实施例中,所述调用kafka推送接口将所述源表数据按照所述操作类型推送到目标的步骤S4之后,包括:
步骤S41,检测所述源表数据的推送是否成功;
步骤S42,若成功,删除所述redis数据库中写入的所述操作类型、标识符rowid和表名;
步骤S43,若不成功,保留所述redis数据库中写入的所述操作类型、标识符rowid和表名,并写入异常告警表。
在一实施例中,数据同步是一个连续的过程,不断有源表数据的标识符rowid、表名等写入redis数据库,当源表数据成功推送到相应的目标表后,表明数据同步已经成功,需要将redis数据库中相应的标识符rowid、表名、操作类型等删除,释放空间,以供其他源表数据的标识符rowid、表名写入redis数据库,当推送不成功,则写入到异常告警表中,异常告警表上有加监控,防止他人进行修改,且异常告警表有写入时,会相应的生成提示信息提示运维人员。
在一实施例中,所述根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤S2,包括:
步骤S21,将所述标识符rowid转换为数字;
步骤S22,将所述数字除以所述zset集合的个数,得到对应的余数;
步骤S23,根据所述余数确定对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合。
本实施例中,redis数据库中设置有多个zset集合,将标识符rowid转换为数字,具体的,可通过哈希计算将标识符rowid转换为数字,再将该数字除以redis数据库中设置的zset集合的个数,可得到对应的余数,每个zset集合都有其对应的标号,如data0,data1,...data19,余数为多少,对应分配到相应的zset集合中。如余数为5,则输入到data5的zset集合中,每个zset集合对应设置有线程数据推送模块,根据预设写入到对应的zset集合中,并根据相应的线程数据推送模块去获取源表数据,避免所有源表数据进入到一个线程数据推送模块。
在一实施例中,所述将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤,包括:
检测所述源表数据的操作类型是否为更新类型;
若是,获取所述源表数据的时间戳;
将所述源表数据的表名、操作类型、标识符rowid和时间戳写入所述redis数据库中对应的zset集合。
本实施例中,对于更新操作类型的源表数据,当多次更新操作后,后续更新的值会覆盖在之前更新的值上,但多次更新的操作需要在目标表中表现出来,因此对于更新操作的源表数据,需要将源表数据的时间戳一起写入到redis数据库中,保证zset集合value值不重复。
参见图2,本申请一实施例提供了一种基于kafka和redis的数据同步装置,包括:
第一获取单元10,用于获取源表数据的操作类型、标识符rowid和所在的源数据表的表名;
写入单元20,用于根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中;
第二获取单元30,用于通过所述zset集合对应的线程从所述zset集合中获取所述表名和所述标识符rowid;
推送单元40,用于通过所述标识符rowid和所述表名获取所述源表数据,并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表。
在一实施例中,所述第一获取单元10,包括:
第一检测子单元,用于检测所述源表数据的操作类型是否为删除类型;
组装子单元,用于若是,将所述源表数据的行数据key-value组装成json文本;
放入子单元,用于将所述json文本放入预设的临时表,并生成对应的标识符rowid。
在一实施例中,所述基于kafka和redis数据库的数据同步装置,还包括:
计算单元,用于计算所述redis数据库中用于数据同步的数据量;
比较单元,用于将所述数据量与数据量阈值进行比较;
调整单元,用于若所述数据量大于所述数据量阈值,调整所述kafka推送接口的推送频率。
在一实施例中,所述基于kafka和redis数据库的数据同步装置,还包括:
第二检测子单元,用于检测所述源表数据的推送是否成功;
删除子单元,用于若成功,删除所述redis数据库中写入的所述操作类型、标识符rowid和表名;
保留子单元,用于若不成功,保留所述redis数据库中写入的所述操作类型、标识符rowid和表名,并写入异常告警表。
在一实施例中,所述写入单元20,包括:
转换子单元,用于将所述标识符rowid转换为数字;
余数子单元,用于将所述数字除以所述zset集合的个数,得到对应的余数;
确定子单元,用于根据所述余数确定对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合。
在一实施例中,所述写入单元20,包括:
第三检测子单元,用于检测所述源表数据的操作类型是否为更新类型;
获取子单元,用于若是,获取所述源表数据的时间戳;
写入子单元,用于将所述源表数据的表名、操作类型、标识符rowid和时间戳写入所述redis数据库中对应的zset集合。
在本实施例中,上述各个单元、子单元的具体实现请参照上述方法实施例中所述,在此不再进行赘述。
参照图3,本申请实施例中还提供一种计算机设备,该计算机设备可以是服务器,其内部结构可以如图3所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设计的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储源数据表、目标表等。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种基于kafka和redis的数据同步方法。
上述处理器执行上述爬虫用户检测方法的步骤:
获取源表数据的操作类型、标识符rowid和所在的源数据表的表名;
根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中;
通过所述zset集合对应的线程从所述zset集合中获取所述表名和所述标识符rowid;
通过所述标识符rowid和所述表名获取所述源表数据,并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表。
在一实施例中,上述处理器执行所述获取源表数据的操作类型、标识符rowid和所在的源数据表的表名的步骤之前,包括:
检测所述源表数据的操作类型是否为删除类型;
若是,将所述源表数据的行数据key-value组装成json文本;
将所述json文本放入预设的临时表,并生成对应的标识符rowid。
在一实施例中,上述处理器执行所述调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表的步骤之后,包括:
计算所述redis数据库中用于数据同步的数据量;
将所述数据量与数据量阈值进行比较;
若所述数据量大于所述数据量阈值,调整所述kafka推送接口的推送频率。
在一实施例中,上述处理器执行所述并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表的步骤之后,包括:
检测所述源表数据的推送是否成功;
若成功,删除所述redis数据库中写入的所述操作类型、标识符rowid和表名;
若不成功,保留所述redis数据库中写入的所述操作类型、标识符rowid和表名,并写入异常告警表。
在一实施例中,上述处理器执行所述根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤,包括:
将所述标识符rowid转换为数字;
将所述数字除以所述zset集合的个数,得到对应的余数;
根据所述余数确定对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合。
在一实施例中,上述处理器执行所述将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤,包括:
检测所述源表数据的操作类型是否为更新类型;
若是,获取所述源表数据的时间戳;
将所述源表数据的表名、操作类型、标识符rowid和时间戳写入所述redis数据库中对应的zset集合。
本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定。
本申请一实施例还提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现一种kafka和redis的数据同步方法,具体为:
获取源表数据的操作类型、标识符rowid和所在的源数据表的表名;
根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中;
通过所述zset集合对应的线程从所述zset集合中获取所述表名和所述标识符rowid;
通过所述标识符rowid和所述表名获取所述源表数据,并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表。
在一实施例中,上述处理器执行所述获取源表数据的操作类型、标识符rowid和所在的源数据表的表名的步骤之前,包括:
检测所述源表数据的操作类型是否为删除类型;
若是,将所述源表数据的行数据key-value组装成json文本;
将所述json文本放入预设的临时表,并生成对应的标识符rowid。
在一实施例中,上述处理器执行所述调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表的步骤之后,包括:
计算所述redis数据库中用于数据同步的数据量;
将所述数据量与数据量阈值进行比较;
若所述数据量大于所述数据量阈值,调整所述kafka推送接口的推送频率。
在一实施例中,上述处理器执行所述并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表的步骤之后,包括:
检测所述源表数据的推送是否成功;
若成功,删除所述redis数据库中写入的所述操作类型、标识符rowid和表名;
若不成功,保留所述redis数据库中写入的所述操作类型、标识符rowid和表名,并写入异常告警表。
在一实施例中,上述处理器执行所述根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤,包括:
将所述标识符rowid转换为数字;
将所述数字除以所述zset集合的个数,得到对应的余数;
根据所述余数确定对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合。
在一实施例中,上述处理器执行所述将所述表名、操作类型和标识符rowid写入所述zset集合中的步骤,包括:
检测所述源表数据的操作类型是否为更新类型;
若是,获取所述源表数据的时间戳;
将所述源表数据的表名、操作类型、标识符rowid和时间戳写入所述redis数据库中对应的zset集合。
综上所述,为本申请提供的基于kafka和redis的数据同步方法、装置、设备和存储介质,获取源表数据的操作类型、标识符rowid和所在的源数据表的表名;根据标识符rowid均分算法计算得到redis数据库中对应的zset集合,并将所述表名、操作类型和标识符rowid写入所述zset集合中;通过所述zset集合对应的线程从所述zset集合中获取所述表名和所述标识符rowid;通过所述标识符rowid和所述表名获取所述源表数据,并调用kafka推送接口将所述源表数据按照所述操作类型推送到目标表。通过仅仅将源表数据的标识符rowid等关键字段写入到redis数据库中,很大程度上减少redis数据库的占用空间,节约成本,在数据推送时,直接根据标识符rowid去得到对应的源表数据,再通过kafka推送接口进行推送,能够快速的进行推送。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储与一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的和实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可以包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM通过多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双速据率SDRAM(SSRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其它变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其它要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、装置、物品或者方法中还存在另外的相同要素。
以上所述仅为本申请的优选实施例,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本申请的专利保护范围内。