本发明涉及数据处理技术领域,尤其涉及一种数据同步系统、方法、计算设备和存储介质。
背景技术:
互联网系统是应用软件和网站的统称,互联网系统的性能将会影响用户的体验,然而获取数据的效率是互联网系统性能的重要表现形式。
目前,为了提高互联网系统获取数据的效率,目前多将热点数据保存至缓存中,并设置热点数据缓存时间,当到达设置的缓存时间后,更新缓存中的热点数据。但是,由于缓存中的数据需要等待设置的缓存时间过期后才会更新缓存中的数据,使得热点数据无法及时缓存,从而影响互联网系统的性能。
为此,需要一种新的数据同步方案,可以使得数据实时同步至缓存。
技术实现要素:
为此,本发明提供一种数据同步系统、方法以及计算设备,以力图解决或至少缓解上面存在的问题。
根据本发明的一个方面,提供一种数据同步系统,所述系统包括:网络服务器、消息队列服务器、消费者服务器和缓存;
所述网络服务器,适于将更新的数据保存至数据库,以及将数据更新消息发送至所述消息队列服务器,其中,所述数据更新消息包括更新数据的唯一标识(id);
所述消息队列服务器,适于接收所述网络服务器发送的所述数据更新消息,并保存至消息队列;
所述消费者服务器,适于订阅所述消息队列服务器的消息队列,消费所述消息队列中的数据更新消息,并从所述数据库中查找与所述id相对应的数据,从查找出的与所述id相对应的数据中选取部分数据同步至所述缓存。
可选地,所述系统还包括客户端,所述客户端适于用户触发更新数据接口和保存数据接口,所述网络服务器进一步适于:
响应用户在所述客户端触发更新数据接口和保存数据接口,将更新数据保存至所述数据库。
可选地,所述网络服务器进一步适于:
预设休眠时间和重试次数;
在预设休眠时间内,判断数据更新消息是否发送至所述消息队列服务器;
若数据更新消息未发送至所述消息队列服务器,则判断重试次数是否小于所述预设重试次数;
若重试次数小于所述预设重试次数,则通过容错机制重新发送所述数据更新消息至所述消息队列服务器,重试次数自增1,若重试次数不小于所述预设重试次数,则停止向所述消息队列服务器发送所述数据更新消息。
可选地,所述消费者服务器进一步适于:
从所述数据库中查找与所述id对应的数据;
在与所述id对应的数据中选取部分数据和业务状态数据;
根据所述业务状态数据将选取的部分数据同步至所述缓存。
可选地,所述消费者服务器进一步适于:
以所述id作为有序集合中键值对的键、以选取的部分数据作为有序集合中键值对的键值,根据所述业务状态数据将已选取的部分数据同步至所述缓存的有序集合的键值对中。
可选地,所述缓存包括一个或多个所述有序集合。
可选地,所述客户端还包括数据获取接口,所述消费者服务器进一步适于:
拆分有序集合中键值对的键值,记录拆分个数,以便于用户在所述客户端触发数据获取接口时,通过多线程并发的方式获取与接口请求获取数据id相对应的键值对的键值,并返回至所述客户端。
可选地,所述消费者服务器进一步适于:
判断是否将所述已选取的部分数据同步至所述缓存,若否,则利用容错机制和重试机制将同步失败的所述已选取的部分数据重新同步至所述缓存。
可选地,所述消费者服务器进一步适于:
校验同步至所述缓存的部分数据与所述数据库中更新数据的对应部分是否一致。
可选地,所述消费者服务器进一步适于:
定期扫描所述数据库的数据表;
通过查找预设时间段内所述数据表的更新数据,确定所述更新数据;
将同步至所述缓存的部分数据与所述数据表中更新数据的对应部分进行比对,若不一致,则将所述更新数据中与已选取的部分数据对应部分再次同步至所述缓存。
根据本发明的另一个方面,提供一种数据同步方法,适于在上述的数据同步系统中运行,方法包括:
网络服务器将更新的数据保存至数据库,以及将数据更新消息发送至消息队列服务器,其中,所述数据更新消息包括更新数据的唯一标识(id);
所述消息队列服务器接收所述网络服务器发送的所述数据更新消息,并保存至消息队列;
消费者服务器订阅所述消息队列服务器的消息队列,消费所述消息队列中的数据更新消息,并从所述数据库中查找与id相对应的数据,从查找出的与id相对应的数据中选取部分数据同步至缓存。
可选地,所述网络服务器将更新的数据保存至数据库包括:
所述网络服务器响应用户在客户端触发更新数据接口和保存数据接口,将更新数据保存至数据库。
可选地,方法还包括:
所述网络服务器预设休眠时间和重试次数;
在预设休眠时间内,所述网络服务器判断数据更新消息是否发送至所述消息队列服务器;
若数据更新消息未发送至所述消息队列服务器,则所述网络服务器判断重试次数是否小于所述预设重试次数;
若重试次数小于所述预设重试次数,则所述网络服务器通过容错机制和重试机制重新发送所述数据更新消息至所述消息队列服务器,重试次数自增1,若重试次数不小于所述预设重试次数,则停止向所述消息队列服务器发送所述数据更新消息。
可选地,所述消费者服务器从所述数据库中查找与id相对应的数据,从查找出的与id相对应的数据中选取部分数据同步至缓存包括:
所述消费者服务器从所述数据库中查找与所述id对应的数据;
在与所述id对应的数据中选取部分数据和业务状态数据;
根据所述业务状态数据将选取的部分数据同步至所述缓存。
可选地,所述消费者服务器根据所述业务状态数据将选取的部分数据同步至所述缓存包括:
以所述id作为有序集合中键值对的键、选取的部分数据作为有序集合中键值对的键值,根据所述业务状态数据将已选取的部分数据同步至所述缓存的有序集合的键值对中。
可选地,所述缓存包括一个或多个所述有序集合。
可选地,所述客户端还包括数据获取接口,所述方法还包括:
所述消费者服务器拆分有序集合中键值对的键值,并记录拆分个数,以便于用户在所述客户端触发数据获取接口时,通过多线程并发的方式获取与接口请求获取数据id相对应的键值对的键值,并返回至所述客户端。
可选地,方法还包括:
所述消费者服务器判断是否将所述已选取的部分数据同步至所述缓存,若否,则利用容错机制和重试机制将同步失败的所述已选取的部分数据重新同步至所述缓存。
可选地,方法还包括:
所述消费者服务器校验同步至所述缓存的部分数据与所述数据库中更新数据的对应部分是否一致。
可选地,所述消费者服务器校验同步至所述缓存的部分数据与所述数据库中更新数据的对应部分是否一致包括:
定期扫描所述数据库的数据表;
通过查找预设时间段内所述数据表的更新数据,确定所述更新数据;
将同步至所述缓存的部分数据与所述数据表中更新数据的对应部分进行比对,若不一致,则将所述更新数据中与已选取的部分数据对应部分再次同步至所述缓存。
根据本发明的另一个方面,提供一种数据获取方法,在网络服务器中执行,所述方法包括:
接收客户端发送的http请求,解析所述http请求得到所述客户端请求获取数据的数据标识(id);
根据所述id确定所述客户端请求获取数据所在的缓存的有序集合和请求获取数据的键值对的键值拆分个数,其中,所述缓存的数据是根据上述的数据同步方法将数据同步至所述缓存的;
通过多线程并发的方式从所述缓存读取所述客户端请求获取数据对应的键值对的键值;
通过所述http响应将已读取的键值对的键值发送至所述客户端。
根据本发明的另一个方面,提供一种计算设备,包括:至少一个处理器;和存储有程序指令的存储器,其中,所述程序指令被配置为适于由所述至少一个处理器执行,所述程序指令包括用于执行如上所述方法的指令。
根据本发明的又一个方面,提供一种存储有程序指令的可读存储介质,当所述程序指令被计算设备读取并执行时,使得所述计算设备执行如上所述的方法。
本发明提供了一种数据同步方法,通过网络服务器将数据更新消息发送到消息队列服务器,消息队列服务器将消息保存至消息队列,消费者服务器消费消息队列中的数据更新消息,并基于数据更新消息同步更新数据至缓存,通过信息队列实现了数据更新、数据缓存的异步操作,使得缓存中的数据是实时更新的,也就是说可以将数据库中变更的数据实时同步至缓存,也能够有效避免因为缓存而阻塞数据更新的正常操作。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
图1示出了根据本发明一个实施例的数据同步系统100的示意图;
图2示出了根据本发明一个实施例的计算设备200的框图;
图3示出了根据本发明一个实施例的数据同步方法300的流程图;
图4示出了根据本发明一个实施例的数据获取方法400的流程图;
图5示出了根据本发明一个实施例的汽车之家网站的客户端110展示一条口碑的示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
互联网系统是应用软件和网站的统称,互联网系统的性能将会影响用户的体验,然而获取数据的效率是互联网系统性能的重要表现形式。目前,为了提高互联网系统获取数据的效率,常用方式是在数据接口加入缓存,缓存中以键值对的形式存储数据,把数据接口请求的参数作为键值对的键,客户端更新并保存的数据作为键值对的键值,从而将在客户端更新的数据同步至缓存,用户请求获取数据时直接从缓存中获取,从而减少数据库的访问量,缓解数据库访问量大导致的卡顿等现象,提高用户获取数据的效率,也就是提高了互联网系统的性能。
但是目前的缓存方式对,会预先设置数据在缓存中存储的时间,往往在缓存中的数据达到预设时间(例如30分钟)后才能再次更新,而在预设时间内即使存在更新的数据,但是若缓存中对应数据的缓存时间未达到预设时间的情况下,缓存中对应的数据无法及时更新,即,若缓存的某一数据存储时间未达到30分钟时,该数据即使在30分钟内更新缓存中也不会更新该数据,而只有达到30分钟的预设时间后,才会更新对应的数据。因此,由于缓存中的数据需要等待预设时间过期后才会更新,使得缓存无法实时更新数据。
为了解决上述问题,本发明提供一种数据同步系统,图1示出了根据本发明一个实施例的数据同步系统100的框图。如图1所示,数据同步系统包括客户端110、网络服务器120、数据库130、消息队列服务器140、消费者服务器150和缓存160。客户端110与网络服务器120耦接,网络服务器120分别与数据库130、消息队列服务器140和缓存160耦接,数据库130分别与客户端110、网络服务器120、消费者服务器150耦接,消费者服务器150分别与数据库130、消息队列服务器140和缓存160耦接。
客户端110即用户所使用的终端设备,其具体可以是桌面电脑、笔记本电脑等个人计算机,也可以是手机、平板电脑、多媒体设备、智能可穿戴设备等,但不限于此。客户端110的用户交互界面包括数据更新接口、保存数据接口、数据获取接口等接口,用户可在客户端110的用户交互界面通过触发数据更新接口更新数据,并通过触发保存接口将更新或发表的数据保存至数据库130,还可以通过触发数据获取接口,通过网络服务器120从数据库130或缓存160获取数据。
网络服务器可以有多个,多个网络服务器120构成网络服务器集群,共同提供将更新的数据保存至数据库130,以及将数据更新消息发送至消息队列服务器140的服务。
数据库130可以是关系型数据库例如mysql、access等,也可以是非关系型数据库例如nosql等;可以是驻留于计算设备中的本地数据库,也可以作为分布式数据库例如hbase等设置于多个地理位置处,总之,数据库130用于存储用户在客户端110发表或更新的数据,本发明对数据库130的具体部署、配置情况不做限制。
消息队列服务器140可为一个或多个,一个或多个消息队列服务器140构成消息队列服务器集群,消息队列服务器集群共同提供接收网络服务器120发送的数据更新消息,并将数据更新消息保存至消息队列的服务,本发明对消息队列服务器140的具体部署、配置情况不做限制。
同样地,消费者服务器150也包括一个或多个,一个或多个消费者服务器150构成消费者服务器集群,消费者服务器集群共同提供订阅消息队列的消息,并消费消息队列的消息,以及能够访问数据库130和缓存160的服务,本发明对消费者服务器150的具体部署、配置情况不做限制。
缓存160可为redis缓存,本发明对缓存具体类型、部署及配置情况不做限制。
本发明的数据同步系统始于用户在客户端110触发更新数据接口,当用户在客户端110的用户交互界面触发更新数据接口时,网络服务器120响应用户的请求,弹出窗口,用户可在该窗口做出发表新数据、修改数据、删除数据或不修改数据等动作,并触发保存数据接口,运营人员会审核用户发表的数据,标记审核状态为通过或不通过,并将审核状态作为业务状态数据,网络服务器120响应用户触发保存数据接口,将更新的数据和业务状态数据保存至数据库130,并向消息队列服务器140发送数据更新消息。
需要注意的是,数据更新消息中仅包括更新数据的唯一标识(id),而网络服务器120为用户发表的每一条数据分配一个id。例如,用户在汽车之家网站的用户交互界面每发表一条口碑(即用户发表一条评论),网络服务器120均会为该口碑分配一个id,若同一用户发表了三条口碑,那么会为每一条口碑分配一个id。
本发明一个实施方式中,用户只要在客户端110的用户交互界面触发更新数据接口和保存数据接口,即使用户实际并未修改数据,网络服务器120仍会将数据保存至数据库130,同时向消息队列服务器140发送数据更新消息。
用户触发更新数据接口后的操作包括增加数据、删除数据、修改数据、不做任何操作等。若用户在窗口输入新数据,那么网络服务器120会为该条新数据分配一个id,并将与id对应的、输入的数据保存至数据库130。若用户在更新窗口修改、删除已保存的数据,那么网络服务器120不会为该数据重新分配id,还是利用数据原id将修改的数据保存至数据库130,或利用数据原id从数据库130中删除id对应的数据。若用户在更新窗口不做任何操作,那么网络服务器120将会将数据库中与原id对应的数据替换为当前的数据,实质上数据未改变,仅仅是执行了一次数据替换操作。
例如,汽车之家网站的用户在客户端110的用户交互界面发表新的口碑(例如对奥迪a6l的一条评论),并触发保存数据接口,网络服务器120响应用户对保存数据接口的触发操作,为用户发表的新口碑分配id,将新口碑保存至数据库130,并向消息队列服务器140发送数据更新消息。若用户在客户端110的用户交互界面修改已发表的口碑,例如追加评论或修改已发表的评论,并触发保存数据接口,此时网络服务器120响应用户对保存数据接口的触发操作,基于原口碑id将追加评论或修改评论保存至数据库130中,并向消息队列服务器140发送数据更新消息。若用户在客户端110的用户交互界面未做任何动作,但是同样触发了保存数据接口,此时网络服务器120响应用户对保存数据接口的触发操作,在数据库中基于原口碑id将原口碑替换为当前口碑,并向消息队列服务器140发送数据更新消息。
在网络服务器120向消息队列服务器140发送数据更新消息的过程中,由于网络闪断等原因,可能会出现数据更新消息发送失败的情况,那么为了保证数据更新消息能够发送至消息队列服务器140,网络服务器120会预设休眠时间和重试次数。本发明一个实施例中,网络服务器120利用java的thread.sleep()函数设置休眠时间,休眠时间一般设置为200ms左右,重试次数可以设置为10,在预设休眠时间(200ms)内,网络服务器120判断数据更新消息是否发送至消息队列服务器140,若未发送至消息队列服务器140,则判断重试次数是否小于预设重试次数,若重试次数小于预设重试次数10,则通过容错机制重新发送数据更新消息至消息队列服务器140,重试次数自增1,若重试次数大于预设重试次数10,则停止向消息队列服务器140发送数据更新消息。
本发明一个实时方式中,容错机制是trycatch机制,利用“则判断重试次数是否小于预设重试次数,若重试次数小于预设重试次数,则通过容错机制重新发送数据更新消息至消息队列服务器,重试次数自增1”实现while循环,并基于while循环和设置的重试次数(10)实现重试机制,从而当出现网络闪断等情况时,通过容错机制和重试机制保证网络服务器120将数据更新消息发送至消息队列服务器140。
在网络服务器120将数据更新消息发送至消息队列服务器140后,消息队列服务器140接收网络服务器120发送的数据更新消息,并保存至消息队列。
之后,消费者服务器150订阅消息队列服务器140的消息队列,消费消息队列中的数据更新消息,并从数据库130中查找与id相对应的数据,从查找出的与id相对应的数据中选取部分数据同步至缓存160。
具体地,消费者服务器150订阅消息队列服务器140的消息队列,不断轮询消息队列,当有新的数据更新消息时,从消息队列中拉取数据更新消息,在数据更新消息中获取数据id,并从数据库130中查找与id相对应的数据,在与id对应的数据中选取部分数据和业务状态数据,为了保障数据状态的准确性,本发明中首先确定数据的状态,并基于数据状态将选取的部分数据同步至缓存160。其中,业务状态数据包括如上所述的运营人员审核用户口碑标记的通过或不通过状态。
上述的选取部分数据是从保存在数据库130的每一条数据中选取一部分数据保存至缓存160,例如,用户在汽车之家网站中发表的一条口碑即为一条数据,每一条口碑对应一个id,每一条口碑包括追加、最满意、最不满意、空间、动力、操控、油耗、舒适性、外观、内饰、性价比等字段的评价内容,而与id对应的数据中选取部分数据,即在一条口碑中选取部分字段的评论内容,例如在一条口碑中选取追加、最满意、最不满意三个字段的评论内容。
本发明中,通过网络服务器120将数据更新消息发送到消息队列服务器140,消息队列服务器140将消息保存至消息队列,消费者服务器150消费消息队列中的数据更新消息,并基于数据更新消息同步更新数据至缓存160,实现了数据更新、数据缓存的异步操作,使得缓存160中的数据是实时更新的,也就是说可以将数据库130中变更的数据实时同步至缓存160,也能够有效避免因为缓存160而阻塞影响数据更新的正常操作。
本发明一个实施方式中,消费者服务器150以id作为有序集合中键值对的键(key)、以选取的部分数据作为有序集合中键值对的键值(value),由于选取的部分数据可能占用较多内存,会导致缓存中键值对的value占用过多内存而影响从缓存160读取数据的效率,例如,value超过10kb时会影响缓存160性能。为了后续能够从缓存高效地读取数据,消费者服务器150将value拆分为多个,拆分后的每一部分键值的key是相同的,均为id,并记录拆分个数。也就是说,一个id下选取的部分数据对应多个键值对,每个键值对的key均为id,每个键值对的value为选取数据的一部分,多个键值对的value之和即为已选取的所有数据。
值得注意的是,数据更新存在时效性,时效性是指发送消息的顺序要和接收消息的顺序相同,例如:程序先发送消息a,然后再发送消息b,则消息接收方应该先接收到消息a,再接收到消息b,若消息接收方先接收到消息b再接收到消息a,则消息的接收顺序是错乱的。
接下来为了保障更新数据的时效性,消费者服务器150根据业务状态数据将已选取的部分数据同步至缓存160,具体地:首先获取业务状态数据,并确定业务状态数据的状态,若业务状态数据为通过状态则将已选取的部分数据对应的键值对保存至缓存160的一个或多个有序集合中,若业务状态数据为不通过状态,则不会将已选取的部分数据保存至缓存160。
例如,若用户发表的口碑id为00000018,消费者服务器根据id从数据库130中获取到00000018的状态数据,若业务状态数据为通过,从id为00000018的口碑的追加、最满意、最不满意、空间、动力、操控、油耗、舒适性、外观、内饰、性价比等字段的评价内容中选取追加、最满意、最不满意三个字段的内容,并将追加、最满意、最不满意字段内容分为三部分,分别为追加字段内容、最满意字段内容、最不满意字段内容,并以00000018作为键值对的key、将选取的数据分为三个键值组合成三个键值对,分别为:(00000018:“追加字段数据”)、(00000018:“最满意字段数据”)和(00000018:“最不满意字段数据”),记录value拆分个数为3,并将已选取的部分数据对应的3个键值对保存至缓存160的一个或多个有序集合中。若00000018对应的业务状态数据为不通过,则不会将已选取的部分数据保存至缓存160。
上述消费者服务器150将有序集合中键值对的value进行拆分,记录拆分个数,以便于用户在客户端110触发数据获取接口时,通过多线程并发的方式获取与接口请求获取数据id相对应的键值对的value,并返回至客户端110,从而在缓存的键值对的value较大时也不会影响从缓存读取数据的效率。
由于数据同步至缓存160的过程中由于网络闪断等原因,可能会出现数据同步失败的情况,因此,为了防止数据同步失败,消费者服务器150判断是否将已选取的部分数据同步至缓存160,若否,则利用容错机制和重试机制将同步失败的已选取的部分数据重新同步至缓存160。本发明一个实施方式中,容错机制是trycatch机制,利用“则判断重试次数是否小于预设重试次数,若重试次数小于预设重试次数,则通过容错机制重新发送数据更新消息至消息队列服务器,重试次数自增1”实现while循环,并基于while循环和设置的重试次数(10)实现重试机制,从而当出现网络闪断等情况时,通过容错机制和重试机制保证消费者服务器150将已选取的数据同步至缓存160。
在使用了数据更新、数据缓存异步机制的场景下可能存在数据丢失的情况,为了解决这一问题,消费者服务器150还会校验同步至缓存160的部分数据与数据库130中更新数据的对应部分是否一致,具体地:若数据库130为关系型数据库时,消费者服务器150定期扫描数据库130的数据表,通过查找预设时间段内数据表的更新数据,确定更新数据,将同步至缓存160的部分数据与数据表中更新数据的对应部分进行比对,若不一致,则将更新数据中与已选取的部分数据对应部分再次同步至缓存160,推送完成后,再次从缓存中拉取数据进行对比,如果还是发现不一致,则可能是程序出错,通知人工进行干预。
例如,更新数据的id为00000018,消费者服务器150在数据库130中查询数据表前一天更新的数据,并从更新的数据中查找与00000018对应数据(包括追加、最满意、最不满意、空间、动力、操控、油耗、舒适性、外观、内饰、性价比字段的评价内容),并比对缓存中的追加、最满意、最不满意三个字段内容与数据库130中00000018对应的追加、最满意、最不满意字段内容是否相同,若相同,则完成数据同步。若不相同,则将数据库130中00000018对应的追加、最满意、最不满意三个字段内容再次同步至缓存160,推送完成后,再次从缓存160中拉取00000018对应的数据进行对比,如果还是发现不一致,则可能是程序bug,需要记录日志,并通知人工进行干预。
应当指出,图1所示的数据同步系统100仅为示例性的,具体实现中,可以部署不同数量的网络服务器120、消息队列服务器140和消费者服务器150,本发明对这些设备的数量和部署区域均不做限制。
数据同步系统100中的网络服务器120、消息队列服务器140和消费者服务器150均可以实现为一台计算设备,但本发明对服务器的具体设备种类不作限制,例如,网络服务器120、消息队列服务器140和消费者服务器150可以实现为桌面电脑、笔记本电脑、处理器芯片、手机、平板电脑等计算设备,但不限于此。
图2示出了根据本发明一个实施例的计算设备200的框图,需要说明的是,图2所示的计算设备200仅为一个示例,在实践中,用于实施本发明的数据同步方法和数据获取方法的计算设备可以是任意型号的设备,其硬件配置情况可以与图2所示的计算设备200相同,也可以与图2所示的计算设备200不同。实践中用于实施本发明的数据同步方法和数据获取方法的计算设备可以对图2所示的计算设备200的硬件组件进行增加或删减,本发明对计算设备的具体硬件配置情况不做限制。
如图2所示,在基本的配置202中,计算设备200典型地包括系统存储器206和一个或者多个处理器204。存储器总线208可以用于在处理器204和系统存储器206之间的通信。
取决于期望的配置,处理器204可以是任何类型的处理,包括但不限于:微处理器(μp)、微控制器(μc)、数字信息处理器(dsp)或者它们的任何组合。处理器204可以包括诸如一级高速缓存210和二级高速缓存212之类的一个或者多个级别的高速缓存、处理器核心214和寄存器216。示例的处理器核心214可以包括运算逻辑单元(alu)、浮点数单元(fpu)、数字信号处理核心(dsp核心)或者它们的任何组合。示例的存储器控制器218可以与处理器204一起使用,或者在一些实现中,存储器控制器218可以是处理器204的一个内部部分。
取决于期望的配置,系统存储器206可以是任意类型的存储器,包括但不限于:易失性存储器(诸如ram)、非易失性存储器(诸如rom、闪存等)或者它们的任何组合。计算设备中的物理内存通常指的是易失性存储器ram,磁盘中的数据需要加载至物理内存中才能够被处理器204读取。系统存储器206可以包括操作系统220、一个或者多个应用222以及程序数据224。在一些实施方式中,应用222可以布置为在操作系统上由一个或多个处理器204利用程序数据224执行指令。操作系统220例如可以是linux、windows等,其包括用于处理基本系统服务以及执行依赖于硬件的任务的程序指令。应用222包括用于实现各种用户期望的功能的程序指令,应用222例如可以是浏览器、即时通讯软件、软件开发工具(例如集成开发环境ide、编译器等)等,但不限于此。当应用222被安装到计算设备200中时,可以向操作系统220添加驱动模块。
在计算设备200启动运行时,处理器204会从存储器206中读取操作系统220的程序指令并执行。应用222运行在操作系统220之上,利用操作系统220以及底层硬件提供的接口来实现各种用户期望的功能。当用户启动应用222时,应用222会加载至存储器206中,处理器204从存储器206中读取并执行应用222的程序指令。
计算设备200还可以包括有助于从各种接口设备(例如,输出设备242、外设接口244和通信设备246)到基本配置202经由总线/接口控制器230的通信的接口总线240。示例的输出设备242包括图形处理单元248和音频处理单元250。它们可以被配置为有助于经由一个或者多个a/v端口252与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口244可以包括串行接口控制器254和并行接口控制器256,它们可以被配置为有助于经由一个或者多个i/o端口258和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备246可以包括网络控制器260,其可以被布置为便于经由一个或者多个通信端口264与一个或者多个其他计算设备262通过网络通信链路的通信。
网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(rf)、微波、红外(ir)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。
在根据本发明的计算设备200中,应用222包括用于执行本发明的方法300或400的指令,该指令可以指示处理器204执行本发明的方法300或400。
图3示出了根据本发明一个实施例的数据同步方法300的流程图,该方法适于在图1所示的数据同步系统中执行。
方法在步骤s310中,通过网络服务器120将更新的数据保存至数据库130,以及将数据更新消息发送至消息队列服务器140。值得注意的是,数据更新消息中仅包括更新数据的唯一标识(id),网络服务器120为用户发表的每一条数据分配一个id。
本发明一个实施方式中,用户只要在客户端110用户交互界面触发更新数据接口和保存数据接口,即使用户实际并未修改数据,网络服务器120仍会将数据保存至数据库130,同时向消息队列服务器140发送数据更新消息。
用户触发更新数据接口后的操作包括增加数据、删除数据、修改数据、不做任何操作等。若用户在窗口输入新数据,那么网络服务器120会为该条新数据分配一个id,并将与id对应的、输入的数据保存至数据库130。若用户在更新窗口修改、删除已保存的数据,那么网络服务器120不会为该数据重新分配id,还是利用数据原id将修改的数据保存至数据库130,或利用数据原id从数据库130中删除id对应的数据。若用户在更新窗口不做任何操作,那么网络服务器120将会将数据库中与原id对应的数据替换为当前的数据,实质上数据未改变,仅仅是执行了一次数据替换操作。
例如,汽车之家网站的用户在客户端110的用户交互界面发表新的口碑(例如对奥迪a6l的一条评论),并触发保存数据接口,网络服务器120响应用户对保存数据接口的触发操作,为用户发表的新口碑分配id,将新口碑保存至数据库130,并向消息队列服务器140发送数据更新消息。若用户在客户端110的用户交互界面修改已发表的口碑,例如追加评论或修改已发表的评论,并触发保存数据接口,此时网络服务器120响应用户对保存数据接口的触发操作,基于原口碑id将追加评论或修改评论保存至数据库130中,并向消息队列服务器140发送数据更新消息。若用户在客户端110的窗口未做任何动作,但是同样触发了保存数据接口,此时网络服务器120响应用户对保存数据接口的触发操作,在数据库中基于原口碑id将原口碑替换为当前口碑,并向消息队列服务器140发送数据更新消息。
在网络服务器120向消息队列服务器140发送数据更新消息的过程中,由于网络闪断等原因,可能会出现数据更新消息发送失败的情况,那么为了保证数据更新消息发送至消息队列服务器140,网络服务器120会预设休眠时间和重试次数。本发明一个实施例中,为了服务器120利用java的thread.sleep()函数设置休眠时间,休眠时间一般设置为200ms左右,重试次数可以设置为10次,在预设休眠时间(200ms)内,网络服务器120判断数据更新消息是否发送至消息队列服务器140,若未发送至消息队列服务器140,则判断重试次数是否小于预设重试次数10,若重试次数小于预设重试次数10,则通过容错机制重新发送数据更新消息至消息队列服务器140,重试次数自增1,若重试次数大于预设重试次数10,则停止向消息队列服务器140发送数据更新消息。
上述的容错机制是trycatch机制,利用“则判断重试次数是否小于预设重试次数,若重试次数小于预设重试次数,则通过容错机制重新发送数据更新消息至消息队列服务器,重试次数自增1”实现while循环,并基于while循环和设置的重试次数(10)实现重试机制,从而当出现网络闪断等情况时,通过容错机制和重试机制保证网络服务器120将数据更新消息发送至消息队列服务器140。
接下来在步骤s320中,消息队列服务器140接收网络服务器120发送的数据更新消息,并保存至消息队列。
之后在步骤s330中,消费者服务器150订阅消息队列服务器140的消息队列,消费消息队列中的数据更新消息,并从数据库130中查找与id相对应的数据,从查找出的与id相对应的数据中选取部分数据同步至缓存160。
具体地,消费者服务器150订阅消息队列服务器140的消息队列,不断轮询消息队列,当有新的数据更新消息时,从消息队列中拉取数据更新消息,在数据更新消息中获取数据id,并从数据库130中查找与id相对应的数据,在与id对应的数据中选取部分数据和业务状态数据,为了保障数据状态的准确性,本发明中首先确定数据的状态,并基于数据状态将选取的部分数据同步至缓存160。其中,业务状态数据包括如上所述的运营人员审核用户口碑标记的通过或不通过状态。
上述的选取部分数据是从保存在数据库130的每一条数据中选取一部分数据保存至缓存160,例如,用户在汽车之家网站中发表的一条口碑即为一条数据,每一条口碑对应一个id,每一条口碑包括追加、最满意、最不满意、空间、动力、操控、油耗、舒适性、外观、内饰、性价比等字段的评价内容,而与id对应的数据中选取部分数据,即在一条口碑中选取部分字段的评论内容,例如在一条口碑中选取追加、最满意、最不满意三个字段的评论内容。
本发明中,通过网络服务器120将数据更新消息发送到消息队列服务器140,消息队列服务器140将消息保存至消息队列,消费者服务器150消费消息队列中的数据更新消息,并基于数据更新消息同步更新数据至缓存160,实现了数据更新、数据缓存的异步操作,使得缓存160中的数据是实时更新的,也就是说可以将数据库130中变更的数据实时同步至缓存160,也能够有效避免因为缓存160而阻塞影响数据更新的正常操作。
本发明一个实施方式中,消费者服务器150以id作为有序集合中键值对的键(key)、以选取的部分数据作为有序集合中键值对的键值(value),由于选取的部分数据可能占用较多内存,会导致缓存中键值对的value占用过多内存而影响从缓存160读取数据的效率,例如,value超过10kb时会影响缓存160性能。为了后续能够从缓存高效地读取数据,消费者服务器150将value拆分为多个,拆分后的每一部分键值的key是相同的,均为id,并记录拆分个数。也就是说,一个id下选取的部分数据对应多个键值对,每个键值对的key均为id,每个键值对的value为选取数据的一部分,多个键值对的value之和即为已选取的所有数据。
值得注意的是,数据更新存在时效性,时效性是指发送消息的顺序要和接收消息的顺序相同,例如:程序先发送消息a,然后再发送消息b,则消息接收方应该先接收到消息a,再接收到消息b,若消息接收方先接收到消息b再接收到消息a,则消息的接收顺序是错乱的。
接下来为了保障更新数据的时效性,消费者服务器150根据业务状态数据将已选取的部分数据同步至缓存160,具体地:首先获取业务状态数据,并确定业务状态数据的状态,若业务状态数据为通过状态则将已选取的部分数据对应的键值对保存至缓存160的一个或多个有序集合中,若业务状态数据为不通过状态,则不会将已选取的部分数据保存至缓存160。
例如,若用户发表的口碑id为00000018,消费者服务器根据id从数据库130中获取到00000018的状态数据,若业务状态数据为通过,从id为00000018的口碑的追加、最满意、最不满意、空间、动力、操控、油耗、舒适性、外观、内饰、性价比等字段的评价内容中选取追加、最满意、最不满意三个字段的内容,并将追加、最满意、最不满意字段内容分为三部分,分别为追加字段内容、最满意字段内容、最不满意字段内容,并以00000018作为键值对的key、将选取的数据分为三个键值组合成三个键值对,分别为:(00000018:“追加字段数据”)、(00000018:“最满意字段数据”)和(00000018:“最不满意字段数据”),记录value拆分个数为3,并将已选取的部分数据对应的3个键值对保存至缓存160的一个或多个有序集合中。若00000018对应的业务状态数据为不通过,则不会将已选取的部分数据保存至缓存160。
上述的消费者服务器150将有序集合中键值对的value进行拆分,记录拆分个数,以便于用户在客户端110触发数据获取接口时,通过多线程并发的方式获取与接口请求获取数据id相对应的键值对的value,并返回至客户端110,从而在缓存的键值对的value较大时也不会影响从缓存读取数据的效率。
由于数据同步至缓存160的过程中由于网络闪断等原因,可能会出现数据同步失败的情况,因此,为了防止数据同步失败,消费者服务器150判断是否将已选取的部分数据同步至缓存160,若否,则利用容错机制和重试机制将同步失败的已选取的部分数据重新同步至缓存160。本发明一个实施方式中,容错机制是trycatch机制,利用“则判断重试次数是否小于预设重试次数,若重试次数小于预设重试次数,则通过容错机制重新发送数据更新消息至消息队列服务器,重试次数自增1”实现while循环,并基于while循环和设置的重试次数(10)实现重试机制,从而当出现网络闪断等情况时,通过容错机制和重试机制保证消费者服务器150将已选取的数据同步至缓存160。
在使用了数据更新、数据缓存异步机制的场景下可能存在数据丢失的情况,为了解决这一问题,消费者服务器150还会校验同步至缓存160的部分数据与数据库130中更新数据的对应部分是否一致,具体地:若数据库130为关系型数据库时,消费者服务器150定期扫描数据库130的数据表,通过查找预设时间段内数据表的更新数据,确定更新数据,将同步至缓存160的部分数据与数据表中更新数据的对应部分进行比对,若不一致,则将更新数据中与已选取的部分数据对应部分再次同步至缓存160,推送完成后,再次从缓存中拉取数据进行对比,如果还是发现不一致,则可能是程序出错,通知人工进行干预。
例如,更新数据的id为00000018,消费者服务器150在数据库130中查询数据表前一天更新的数据,并从更新的数据中查找与00000018对应数据(包括追加、最满意、最不满意、空间、动力、操控、油耗、舒适性、外观、内饰、性价比字段的评价内容),并比对缓存中的追加、最满意、最不满意三个字段内容与数据库130中00000018对应的追加、最满意、最不满意字段内容是否相同,若相同,则完成数据同步。若不相同,则将数据库130中00000018对应的追加、最满意、最不满意三个字段内容再次同步至缓存160,推送完成后,再次从缓存160中拉取00000018对应的数据进行对比,如果还是发现不一致,则可能是程序bug,需要记录日志,并通知人工进行干预。
图4示出了根据本发明一个实施例的数据获取方法400的流程图,该方法适于在网络服务器120中执行。
应当指出,数据获取方法400从数据同步方法300的缓存160中获取数据。
在步骤s410中,接收客户端110发送的http请求,解析http请求得到客户端110请求获取数据的数据标识(id)。
用户在客户端110的用户交互界面触发数据获取接口,向网络服务器120发送http请求,http请求中包括获取数据的id,网络服务器120接收客户端110发送的http请求并解析,从而得到获取数据的id。
接下来在步骤s420中,根据id确定客户端请求获取数据所在的缓存的有序集合和请求获取数据的键值对的键值拆分个数。
需要注意的是,缓存的数据是根据上述的数据同步方法300将数据同步至缓存的,因此缓存160中存储的每个id对应的部分数据,并且缓存160中将一个id下选取的部分数据拆分成多个键值对,每个键值对的key均为id,每个键值对的value为选取数据的一部分,也就是说,缓存中与id对应的键值对可能有多个。
因此,网络服务器120首先确定请求获取的数据在缓存中的位置,即在缓存的哪个有序集合中,再查找与id对应的键值对个数,通过多线程并发的方式从缓存160读取客户端110请求获取数据对应的键值对的键值,从而得到客户端110请求获取的数据。
最后在步骤s420中,通过http响应将已读取的键值对的键值发送至客户端,并展示。如图5所示,图5为汽车之家网站的客户端110展示一条口碑的示意图,由于缓存160中仅缓存用户发表的口碑的部分数据,因此在图5中可以看出,客户端110仅展示口碑的追加、最满意、最不满意三部分字段的内容,与缓存的数据相对应。若用户想查看该条口碑的所有内容,则需要触发“查看全部内容”接口,并向网络服务器120发送http请求,http请求中包括请求获取全部内容的口碑id,网络服务器120接收http请求并解析,从而确定请求获取全部内容的口碑对应的id,从数据库130中查找与id对应的全部数据,并通过http响应发送至客户端110,在客户端110的用户交互界面展示该条口碑的所有内容。
本发明中通过多线程并发的方式从缓存160读取客户端110请求获取数据对应的键值对的键值,由于多线程并发的方式从缓存160获取数据,从而能够在value占用内存较大的情况下保障缓存160的读取效率。并且在用户界面展示从缓存中读取的数据,由于从缓存中读取的是部分口碑内容,所以在客户端的展示界面的一页能够展示多条口碑,使得用户再用户界面能够一次查看多条口碑。
这里描述的各种技术可结合硬件或软件,或者它们的组合一起实现。从而,本发明的方法和设备,或者本发明的方法和设备的某些方面或部分可采取嵌入有形媒介,例如可移动硬盘、u盘、软盘、cd-rom或者其它任意机器可读的存储介质中的程序代码(即指令)的形式,其中当程序被载入诸如计算机之类的机器,并被所述机器执行时,所述机器变成实践本发明的设备。
在程序代码在可编程计算机上执行的情况下,计算设备一般包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件),至少一个输入装置,和至少一个输出装置。其中,存储器被配置用于存储程序代码;处理器被配置用于根据该存储器中存储的所述程序代码中的指令,执行本发明的数据同步方法和数据获取方法。
以示例而非限制的方式,可读介质包括可读存储介质和通信介质。可读存储介质存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息。通信介质一般以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其它数据,并且包括任何信息传递介质。以上的任一种的组合也包括在可读介质的范围之内。
在此处所提供的说明书中,算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与本发明的示例一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的而非限制性的,本发明的范围由所附权利要求书限定。
1.一种数据同步系统,所述系统包括:网络服务器、消息队列服务器、消费者服务器和缓存;
所述网络服务器,适于将更新的数据保存至数据库,以及将数据更新消息发送至所述消息队列服务器,其中,所述数据更新消息包括更新数据的唯一标识(id);
所述消息队列服务器,适于接收所述网络服务器发送的所述数据更新消息,并保存至消息队列;
所述消费者服务器,适于订阅所述消息队列服务器的消息队列,消费所述消息队列中的数据更新消息,并从所述数据库中查找与所述id相对应的数据,从查找出的与所述id相对应的数据中选取部分数据同步至所述缓存。
2.如权利要求1所述的系统,其中,所述系统还包括客户端,所述客户端适于用户触发更新数据接口和保存数据接口,所述网络服务器进一步适于:
响应用户在所述客户端触发更新数据接口和保存数据接口,将更新数据保存至所述数据库。
3.如权利要求2所述的系统,其中,所述网络服务器进一步适于:
预设休眠时间和重试次数;
在预设休眠时间内,判断数据更新消息是否发送至所述消息队列服务器;
若数据更新消息未发送至所述消息队列服务器,则判断重试次数是否小于所述预设重试次数;
若重试次数小于所述预设重试次数,则通过容错机制重新发送所述数据更新消息至所述消息队列服务器,重试次数自增1,若重试次数不小于所述预设重试次数,则停止向所述消息队列服务器发送所述数据更新消息。
4.如权利要求1所述的系统,其中,所述消费者服务器进一步适于:
从所述数据库中查找与所述id对应的数据;
在与所述id对应的数据中选取部分数据和业务状态数据;
根据所述业务状态数据将选取的部分数据同步至所述缓存。
5.一种数据同步方法,适于在如权利要求1-4中任一项所述的数据同步系统中运行,所述方法包括:
网络服务器将更新的数据保存至数据库,以及将数据更新消息发送至消息队列服务器,其中,所述数据更新消息包括更新数据的唯一标识(id);
所述消息队列服务器接收所述网络服务器发送的所述数据更新消息,并保存至消息队列;
消费者服务器订阅所述消息队列服务器的消息队列,消费所述消息队列中的数据更新消息,并从所述数据库中查找与id相对应的数据,从查找出的与id相对应的数据中选取部分数据同步至缓存。
6.如权利要求5所述的方法,其中,所述网络服务器将更新的数据保存至数据库包括:
所述网络服务器响应用户在客户端触发更新数据接口和保存数据接口,将更新数据保存至数据库。
7.如权利要求5所述的方法,还包括:
所述网络服务器预设休眠时间和重试次数;
在预设休眠时间内,所述网络服务器判断数据更新消息是否发送至所述消息队列服务器;
若数据更新消息未发送至所述消息队列服务器,则所述网络服务器判断重试次数是否小于所述预设重试次数;
若重试次数小于所述预设重试次数,则所述网络服务器通过容错机制和重试机制重新发送所述数据更新消息至所述消息队列服务器,重试次数自增1,若重试次数不小于所述预设重试次数,则停止向所述消息队列服务器发送所述数据更新消息。
8.一种数据获取方法,在网络服务器中执行,所述方法包括:
接收客户端发送的http请求,解析所述http请求得到所述客户端请求获取数据的数据标识(id);
根据所述id确定所述客户端请求获取数据所在的缓存的有序集合和请求获取数据的键值对的键值拆分个数,其中,所述缓存的数据是根据权利要求5至7中任一项所述的方法将数据同步至所述缓存的;
通过多线程并发的方式从所述缓存读取所述客户端请求获取数据对应的键值对的键值;
通过所述http响应将已读取的键值对的键值发送至所述客户端。
9.一种计算设备,包括:
至少一个处理器;和
存储有程序指令的存储器,其中,所述程序指令被配置为适于由所述至少一个处理器执行,所述程序指令包括用于执行如权利要求5-7中任一项所述方法的指令。
10.一种存储有程序指令的可读存储介质,当所述程序指令被计算设备读取并执行时,使得所述计算设备执行如权利要求5-7中任一项所述的方法。
技术总结