背景技术
随着网络技术和计算机技术的飞速发展,人们的日常生活中产生着越来越多的数据和信息,如电子消费记录等需要存储和保留,以方便用户查询留档。现有的单机***对海量数据存储已不能满足要求,对键值数据查询更是力不能及,因此对海量键值数据的有效管理是一个亟需解决的问题。
所述键值(KeyValue,KV)数据指的是查询请求信息Key和查询结果信息Value。
图1为现有技术的单机键值数据批量互查***的方法流程图。
用户向单机键值数据批量互查***发送批量查询请求信息Key,经过单机键值数据批量互查***的查询,将查询结果信息Value返回用户。
单机键值数据批量互查***接收到用户的查询请求信息后,
(1)若查询请求信息Key是一段文本信息,首先在单机KV***中查询标志这段文本信息的标识信息(Identity,ID),若查询到标志这段文本信息的ID,则将此标志这段文本信息的ID作为查询结果信息Value返给用户;若查询不到标志这段文本信息的ID,则根据消息摘要算法(MessageDigestAlgorithm,MD5)或是通用唯一识别码(UniversallyUniqueIdentifier,UUID)算法把这段文本信息转成标志这段文本信息的ID并保存在单机KV***中;然后将这个新生成的ID作为查询结果信息Value返给用户。
(2)若查询请求信息是ID,首先在单机KV***中查询此ID所标志的一段文本信息,若查询到此ID所标志的一段文本信息,则将此ID所标志的一段文本信息作为查询结果信息Value返给用户;若查询不到此ID所标志的一段文本信息,则查询结果信息Value为空,也就是没有匹配的文本信息,然后将此查询结果信息Value发送给用户。
其中,消息摘要算法(MessageDigestAlgorithm,MD5)是把一个任意长度的字节串变换成一定长的大整数。该算法使用的是哈希函数,以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
MD5的结果是128位,4位组成了一个16进制的数字,所以128除以4=32个
数字,所以MD5有32个字符。
标准的UUID格式为:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(8-4-4-4-12)。
每8个字符用“-”相连,这样有4个“-”相连就得到了UUID,所以UUID是32+4=36个字符
UUID的目的,是让分布式***中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。
该现有技术的单机键值数据互查***,将数据都保存在单机***上,但是当数据量达到百万级别时性能就很难再提升,所以该***缺乏伸缩性。
随着互联网的迅速发展,分布式***得到了广泛的应用。
图2A为现有技术的分布式KV数据逐次互查***的方法流程图;
图2B为现有技术的分布式KV数据逐次互查***架构示意图;
用户向分布式键值数据逐次查询***发送批量查询请求信息Key,经过分布式键值数据逐次查询***的查询,将查询结果信息Value返回用户。
分布式键值数据逐次查询***接收到用户的查询请求信息Key后,
(1)查询请求的信息Key是一段文本信息,根据映射规则来确定将Key映射到分布式KV***中对应的服务器。首先在分布式KV***中对应的服务器上查询标志这段文本信息的ID,若查询到标志这段文本信息的ID,则将此标志这段文本信息的ID作为查询结果Value返给用户;若查询不到标志这段文本信息的ID,则在分布式数据库***中查询标志这段文本信息的ID,若查询到标志这段文本信息的ID,则将此标志这段文本信息的ID作为查询结果Value返给用户;若查询不到标志这段文本信息的ID,则根据MD5或UUID算法把这段文本转成标志这段文本的ID信息并保存在分布式数据库***中,然后将标志这段文本的ID信息作为查询结果Value发送给用户。
(2)查询请求的信息Key是ID,首先在分布式KV***中查询此ID所标志的一段文本信息,若查询到此ID所标志的一段文本信息,则将此ID所标志的一段文本信息作为查询结果Value用户;若查询不到此ID所标志的一段文本信息,则在分布式数据库***中查询此ID所标志的一段文本信息,若查询到此ID所标志的一段文本信息,则将此ID所标志的一段文本信息作为查询结果Value用户;若查询不到此ID所标志的一段文本信息,则查询结果Value为空,也就是没有匹配的文本,然后将此查询结果Value返给用户。
其中,到分布式KV***或到分布式数据库***去查询都需要建立连接,这种连接的创建和销毁在技术是很耗成本的。现有技术中采用的是“连接池”技术,“连接池”用来缓存已经创建的可用连接的集合,当需要时直接从这个集合中去取。同时为了避免并发情况下一个连接被多个客户端取到,要用“锁”来保持同步,;同理,每次用完要返回连接也要用“锁”来同步。其中,“锁”的功能是独占连接池,查看该连接池的最新情况,其他客户端只能等到该“锁”释放后,才可以得到该“锁”,从而从连接池中取得连接。这种采用有“锁”的连接池技术,“锁”对***性能有较大影响,使得***的响应速度很慢,另一个方面是如果忘了返回对象容易造成“内存泄露”。其中,所述“内存泄露”是指被借用的连接没有归还,不但导致该连接不能被其他请求使用而且还一直占用内存。
该现有技术的分布式键值数据逐次查询方法的缺点是:
(1)采用消息摘要算法(MessageDigestAlgorithm,MD5)或是通用唯一识别码(UniversallyUniqueIdentifier,UUID)作为ID,使得ID的长度太长了,MD5要用32个字符,UUID要用36个字符,所保存的文本信息可能还没有ID长,这样浪费了存储空间;
(2)采用MD5或UUID算法产生的ID重复概率达到很低,虽然概率很低,但重复的概率还是有的,本身还是不能保证唯一性;
(3)所有的查询都是逐次查询的,特别依赖于一次请求的数量,有可能会出现响应很慢的场景,这对于关键应用是不允许的。
发明内容
本申请的目的是,提供一种键值数据查询的方法和装置。该方法和装置采用白名单保证了生成标识信息ID的唯一性,采用合并查询和无锁连接池使得处理的数据量有很大的增加以及响应时间有很大提高。
为实现上述目的,本申请提供了一种键值数据查询的方法,所述方法包括:
接收携带多个查询请求信息的键值数据,所述查询请求信息为第一信息;
根据所述键值数据中携带的所述第一信息查询白名单;
当确定所述白名单中没有查询到所述第一信息,则将所述第一信息转换为第一标识信息,并确定多个所述第一标识信息的键值服务器;
将确定为同一个键值服务器的多个所述第一标识信息合并,并向所述键值服务器查询合并的多个所述第一标识信息;
当确定所述键值服务器中查询到所述第一标识信息,所述第一标识信息对应的信息为第二信息,并且所述第二信息与所述第一信息不同,则将所述第一信息转换为第二标识信息,并将所述第一信息和所述第二标识信息存入白名单,所述第二标识信息为所述第一信息的查询结果信息;
发送携带多个所述查询结果信息的键值数据。
本申请还提供了一种键值数据查询的方法,所述方法包括:
接收携带多个查询请求信息的键值数据,所述查询请求信息为查询请求标识信息;
根据所述键值数据中携带的所述查询请求标识信息查询白名单;
当确定所述白名单中没有查询到所述查询请求标识信息,则确定所述查询请求标识信息的键值服务器;
将同一个所述键值服务器的多个所述查询请求标识信息合并,并向所述键值服务器查询合并的多个所述查询请求标识信息;
当确定所述键值服务器中查询到所述查询请求标识信息,则所述查询请求标识信息对应的信息为所述查询请求标识信息的查询结果信息;
发送携带多个所述查询结果信息的键值数据。
相应地,本申请还提供一种键值数据查询的装置,所述装置包括:
接收单元,用于接收携带多个查询请求信息的键值数据,所述查询请求信息为第一信息;
白名单查询单元,用于根据所述键值数据中携带的所述第一信息查询白名单;
第一标识信息单元,用于当确定所述白名单中没有查询到所述第一信息,则将多个所述第一信息生成与多个所述第一信息相对应的多个第一标识信息,并确定多个所述第一标识信息的键值服务器;
合并单元,用于将确定为同一个键值服务器的多个所述第一标识信息合并,并向所述键值服务器查询合并的多个所述第一标识信息;
键值服务器查询单元,用于在键值服务器中查询合并的多个所述第一标识信息;
第二标识信息单元,用于当确定所述键值服务器中或者数据库中查询到所述第一标识信息,所述第一标识信息对应的信息为第二信息,并且所述第二信息与所述第一信息不同,将所述第一信息转换为第二标识信息,所述第二标识信息为所述第一信息的查询结果信息;
保存单元,用于将所述第一信息和所述第二标识信息存入白名单中;
发送单元,用于发送携带多个所述查询结果信息的键值数据。
相应地,本申请还提供一种键值数据查询的装置,所述装置包括:
接收单元,用于接收携带多个查询请求信息的键值数据,所述查询请求信息为查询请求标识信息;
白名单查询单元,用于根据所述键值数据中携带的所述查询请求标识信息查询白名单;
合并单元,用于当确定所述白名单中没有查询到所述查询请求标识信息,则确定所述查询请求标识信息的键值服务器,将同一个所述键值服务器的多个所述查询请求标识信息合并,并向所述键值服务器查询合并的多个所述查询请求标识信息;
键值服务器查询单元,用于在键值服务器中查询合并的多个所述查询请求标识信息,当确定所述键值服务器中查询到所述查询请求标识信息,则所述查询请求标识信息对应的信息为所述查询请求信息的查询结果信息;
发送单元,用于发送携带多个所述查询结果信息的键值数据。
因此,本申请实现了对海量键值数据进行高速批量查询,采用白名单保证了生成标识信息ID的唯一性并采用合并查询请求信息和无锁连接池使得处理的数据量有很大的增加以及响应时间有很大提高。
具体实施方式
下面通过附图和实施例,对本申请的技术方案做进一步的详细描述。
本申请基于分布式结构利用白名单保证了生成标识信息ID的唯一性,以及将用户发起的多个指向同一个键值服务器的查询请求信息进行合并,从无锁连接池中取得连接,并行发送到键值服务器或数据库中查询,从而实现了高速的键值数据查询。其中,键值(KeyValue,KV)数据指的是查询请求信息Key和查询结果信息Value。
图3为本申请实施例键值数据查询方法应用场景示意图。该应用场景包括:海量键值数据查询***、分布式键值***,分布式数据库***。其中,分布式键值***中包括n个键值服务器。
海量键值数据查询***用于接收携带多个查询请求信息的键值数据,并根据查询请求信息查询分布式键值***和分布式数据库***。其中,查询请求信息不限于使用文本信息这种类型,还包括其他类型的查询请求信息,比如图片信息、视频信息等;同时也不只限于使用标志文本信息的ID,还包括标志其他类型查询请求信息的ID。
分布式键值***用于保存查询请求信息以及相应的查询结果信息,同时接收海量键值数据查询***的查询请求信息,并将查询结果信息返回海量键值数据查询***。
分布式数据库***也用于保存查询请求信息以及相应的查询结果信息,同时接收海量键值数据查询***的查询请求信息,并将查询结果信息返回海量键值数据查询***。
其中,根据查询请求信息查询分布式键值***没有统一的界面,分布式键值***的查询速度很快。根据查询请求信息查询分布式数据库***有统一的界面,即分布式数据库管理界面,分布式数据库***查询速度比较慢。
图4为本申请实施例公开的一键值数据查询方法的流程图,如图所示,本实施例包括如下步骤:
具体实现过程如下:
步骤401:接收携带多个查询请求信息的键值数据。
具体地,接收用户发送来的携带多个查询请求信息的键值数据,查询请求信息为第一信息。其中,第一信息在本申请实施例中为文本信息,在此称为第一文本信息。但是,第一信息并不限于使用文本信息这种类型,还包括其他类型的查询请求信息,比如图片信息、视频信息等。
步骤402:在白名单中查询键值数据中携带的第一文本信息并判断是否查到第一文本信息。
具体地,所述白名单用于保存产生唯一性冲突的第一信息以及标志第一信息的ID。当将第一信息保存到指定键值服务器或数据库时,对同一个键值服务器或数据库按照ID建唯一性约束,这样不同的第一信息产生了同样的ID会落在同一个键值服务器或数据库中,从而发生了唯一性冲突。在本申请实施例中,对于产生唯一性冲突的第一信息,采用调用自增长ID***获取一个新的ID,并将该ID与产生唯一性冲突的第一信息保存到白名单中。
根据键值数据中携带的第一文本信息查询白名单。在白名单中查询第一文本信息时会出现两种查询结果,若查到第一文本信息,则到步骤403,若查不到第一文本信息,则到步骤404。
步骤403:将第一文本信息对应的标识信息ID返给用户。
具体地,所述白名单用于保存产生唯一性冲突的第一信息以及标志第一信息的ID。当确定白名单中查询到第一文本信息,则获取第一文本信息对应的标识信息ID为查询结果信息,该标识信息ID用来标志第一信息,并将携带多个查询结果信息的键值数据发送给用户。
所述第一信息可以为文本信息、图片信息或视频信息等类型的信息,比如电子商务网站提供了商品交易的平台,商品的信息有些是相同的,以衣服为例都有颜色、尺寸、面料这3种属性,不管是裙子、外套都要写这些属性,如果衣服有相同的信息用同一个标识信息ID来表示可以降低容量、快速找到相同特征的服饰,所以***是以标识信息ID来保存这些信息的。当用户查看详细信息时,要根据标识信息ID把具体的信息(比如上述的颜色、尺寸、面料)再显示出来。
步骤404:将第一文本信息转换成第一标识信息。
具体地,当确定白名单中没有查询到第一文本信息,则将第一文本信息转换为第一标识信息,并确定多个第一标识信息的键值服务器。第一标识信息为11位标识信息ID,该11位ID标识信息用来标志第一文本信息。
其中,将第一文本信息转换为第一标识信息的具体过程如下:
(1)将第一文本信息按照消息摘要算法(MessageDigestAlgorithm,MD5)算法生成一个128位散列值,共16个字节。
(2)在16个字节中,取其中的8个字节共64位,然后再取64位中的60位,最后将该60位分成10段,每6位的数字作为字母表的索引取得特定字符,依次进行获得10位的标识信息ID。其中,字母表包括英文字符A-Z,a-z,数字0-9,其他字符+和-,共64个字符。
(3)10位标识信息ID+第一标志符=第一标识信息,也就是说第一标识信息是10位标识信息ID与第一标志符之和。其中,第一标志符是自定义的,表明第一标识信息是需要存入键值服务器或者数据库的信息。
步骤405:将确定为同一个键值服务器的多个第一标识信息合并,并向键值服务器查询合并的多个第一标识信息。
具体过程如下:
(1)根据映射规则确定多个第一标识信息的键值服务器,并将确定为同一个键值服务器的多个第一标识信息合并,如图5所示,为本申请实施例键值数据查询方法合并第一标识信息的示意图。
其中,第一标识信息(1)映射到键值服务器1,第一标识信息(2)映射到键值服务器1,...,第一标识信息(m)映射到键值服务器1,由此可见第一标识信息(1)、第一标识信息(2)、...、第一标识信息(m)都映射到键值服务器1,所以将映射到键值服务器1的用户查询请求合并成同一个查询请求即用户查询请求(第一标识信息(1)、第一标识信息(2)、...、第一标识信息(m))映射到键值服务器1。同理,第一标识信息(n)映射到键值服务n,...,第一标识信息(z)映射到键值服务器n,所以将映射到键值服务器n的用户查询请求合并成同一个查询请求即用户查询请求(第一标识信息(n)、...、第一标识信息(z))映射到键值服务器n。还有,根据第一标识信息确定键值服务器的映射规则是采用Mod取余数算法或者一致性哈希Hash算法。该映射规则用于指定将第一标识信息保存到KV***中哪一个键值服务器上。
取余数Mod算法:将第一标识信息除以服务器的数量n得到的余数,这个余数表示提供服务的键值服务器的编号。
一致性Hash算法:首先求出每个服务器节点的哈希Hash值,并将其配置到一个0-232圆环区间上(如果服务器节点的数量比较少,那么一个服务器节点在环上生成多个映射点即虚拟节点来增加数量)。其次求出所需要存储的第一文本信息的第一标识信息,也将其配置到这个圆环上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务节点上。如果超过232仍然找不到服务器节点,就会保存到第一个服务器节点上。一致性哈希算法最大程度的避免了文本信息在服务节点列表上的重新分布,其他附带的改进就是有的一致性哈希算法还增加了虚拟服务器节点的方法,也就是一个服务器节点在环上有多个映射点,这样就能抑制分布不均匀,最大限度地减小服务节点增减时的缓存重新分布。
(2)从无锁连接池取得连接。无锁连接池为取连接的合并的多个第一标识信息分配编号,编号标识连接在集合中的索引位置;索引位置的变化通过原子变量更新,如果连接不归还则强制断开连接。具体地,该无锁连接池是不通过加锁Lock-free这种阻塞的方式来取得的,首先,每一个来取连接的请求都会分配一个“编号”,这个编号是连接在集合中的索引位置;索引位置的变化是通过硬件支持的原子变量(CompareAndSet,CAS)来更新,现有的处理器提供了特殊的指令可以自动更新共享数据(提供了原子性的读-写-修改操作),而且能够检测到其他线程的干扰。该连接是基于“有一个保存连接池的数组,所有的存取操作都是原子性的”,所以不需要加锁;然后,建立合并的查询请求与索引位置之间的连接;最后,若建立的连接长时间不归还,则强制断开该连接。该无锁连接池技术不需要保存已被引用的连接,所以即使不归还连接也不会导致“内存泄露”,但归还了后被复用性能会很好。其中,“内存泄露”是特指被借用的连接没有归还,不但导致该连接不能被其他请求使用而且还一直占用内存。
(3)将合并的第一标识信息并行发送到键值服务器做查询。
步骤406:查询键值服务器并判断是否查询到第一标识信息。
具体地,根据多个第一标识信息查询键值服务器。在键值服务器中查询会出现两种查询结果,若查到第一标识信息,则到步骤407,若查不到第一标识信息,则到步骤412。
步骤407:将第二文本信息与第一文本信息做比较并判断是否相同。
具体地,在键值服务器上查询到第一标识信息,第一标识信息对应的文本信息为第二文本信息,将第二文本信息与第一文本信息做比较。若第二文本信息与第一文本信息相同,则到步骤408,若第二文本信息与第一文本信息不同,则到步骤409。
步骤408:将第一标识信息返给用户。
具体地,当确定键值服务器中查询到第一标识信息,并且第二文本信息与第一文本信息相同,则第一标识信息为查询结果信息,并将携带多个查询结果信息的键值数据发送给用户。
步骤409:将第一文本信息转换为第二标识信息。
具体地,当确定键值服务器中查询到第一标识信息,并且第二文本信息与第一文本信息不同,则将第一文本信息转换为第二标识信息,该第二标识信息是调用“自增长信息***”获得的。
其中,将第一文本信息转换为第二标识信息的具体过程如下:
(1)调用“自增长标识信息***”获取自增长标识信息。
自增长标识信息***是自增长的,自增长标识信息是“自增长标识信息***”中的标识信息初始值与一个自定义的自增长值之和。
(2)自增长标识信息+第二标志符=第二标识信息,也就是说第二标识信息是自增长标识信息与第二标志符之和。其中,第二标志符是自定义的,表明第二标识信息是需要存入白名单的信息。
步骤410:将第二标识信息保存在白名单中。
具体地,将第一文本信息和第二标识信息存入白名单。
步骤411:将第二标识信息返给用户。
具体地,第二标识信息为查询结果信息,并将携带多个查询结果信息的键值数据发送给用户。
步骤412:在查询数据库查询第一标识信息并判断是否查到第一标识信息。
具体地,当确定键值服务器中没有查询到第一标识信息,则在分布式数据库中查询第一标识信息。根据多个第一标识信息查询数据库。在数据库中查询会出现两种查询结果,若查询到第一标识信息,则到步骤416,若没有查询到第一标识信息,则到步骤413。
步骤413:将第一标识信息保存在键值服务器。
具体地,当确定数据库中没有查询到第一标识信息,则将第一标识信息和第一文本信息保存到由第一标识信息确定的键值服务器中。
步骤414:将第一标识信息保存在数据库。
具体地,当确定数据库中没有查询到第一标识信息,则将第一标识信息和第一文本信息保存数据库中。
步骤415:将第一标识信息返给用户。
具体地,第一标识信息为查询结果信息,并将携带多个查询结果信息的键值数据发送给用户。
步骤416:将第三文本信息与第一文本信息比较并判断是否相同。
具体地,在数据库上查询到第一标识信息,第一标识信息对应的文本信息为第三文本信息,将第三文本信息与第一文本信息做比较。若第三文本信息与第一文本信息相同,则到步骤417,若第三文本信息与第一文本信息不同,则到步骤418。
步骤417:将第一标识信息返给用户。
具体地,当确定数据库中查询到第一标识信息,并且第三文本信息与第一文本信息相同,则第一标识信息为查询结果信息,并将携带多个查询结果信息的键值数据发送给用户。
步骤418:将第一文本信息转换为第二标识信息。
具体地,当确定数据库中查询到第一标识信息,并且第三文本信息与第一文本信息不同,则将第一文本信息转换为第二标识信息,该第二标识信息是调用“自增长标识信息***”获得的。
其中,将第一文本信息转换为第二标识信息的具体过程如下:
(1)调用“自增长标识信息***”获取自增长标识信息。
自增长标识信息***是自增长的,自增长标识信息是“自增长标识信息***”中的标识信息初始值与一个自定义的自增长值之和。
(2)自增长标识信息+第二标志符=第二标识信息,也就是说第二标识信息是自增长标识信息与第二标志符之和。其中,第二标志符是自定义的,表明第二标识信息是需要存入白名单的信息。
步骤419:将第二标识信息保存到白名单中。
具体地,将第一文本信息和第二标识信息存入白名单。
步骤420:将第二标识信息返给用户。
具体地,第二标识信息为查询结果信息,并将携带多个查询结果信息Value的键值数据发送给用户。
因此,本申请实施例公开的一键值数据查询方法,接收用户发送来的携带多个查询请求信息Key的键值数据,该查询请求信息为第一文本信息。采用将第一文本信息转为11位字符的第一标识信息,调用自增长***将第一文本信息转为第二标识信息保存在白名单中,从而保证将第一文本信息生成标识信息ID的唯一性,也保证了查询结果信息的唯一性。将确定为同一个键值服务器的多个第一标识信息合并,采用无锁连接池技术,从无锁连接池中取得连接。与有“锁”连接池技术相比,无锁连接池技术大幅度降低取连接地成本,提高了并发取连接的性能,加快了该查询方法的查询速度。
值得指出的,采用将第一文本信息转为11位字符的第一标识信息,这样能够保证不同的第一文本信息生成相同的第一标识信息的概率非常低,只有当保存的数据量达到了13亿时才可能发生第一次重复;若出现了不同的第一文本信息生成相同的第一标识信息的情况,采用调用自增长***将第一文本信息转为第二标识信息保存在白名单中,从而保证了查询结果信息的唯一性,使得在百亿级别数据量的应用场景下用11个字符能保证生成唯一性的标识信息ID。
图6为本申请实施例公开的另一键值数据查询方法的流程图。
具体实现过程如下:
步骤601:接收携带多个查询请求信息的键值数据。
具体地,接收用户发送来的携带多个查询请求信息的键值数据,查询请求信息为查询请求标识信息ID。其中,该查询请求标识信息ID在本申请实施例中为标志文本信息的ID。但是,查询请求信息并不限于使用标志文本信息的ID,还包括标志其他类型查询请求信息的ID,比如标志图片信息、视频信息等查询请求信息的ID。
步骤602:根据键值数据中携带的查询请求标识信息查询白名单并判断是否查到查询请求标识信息。
具体地,所述白名单用于保存产生唯一性冲突的第一信息以及标志第一信息的ID。其中,第一信息与标志第一信息的ID是一一对应的。
根据键值数据中携带的查询请求标识信息查询白名单,并在标志第一信息的ID中查找查询请求标识信息,最后会出现两种查询结果,若查到查询请求标识信息,则到步骤607,若没有查询到查询请求标识信息,则到步骤603。
步骤603:将确定为同一个键值服务器的多个查询请求标识信息合并,并向键值服务器查询合并的多个查询请求标识信息。
具体过程如下:
(1)根据映射规则确定多个查询请求标识信息的键值服务器,并将确定为同一个键值服务器的多个查询请求标识信息合并,如图7所示,为本申请实施例键值数据查询方法合并查询请求标识信息的示意图。
其中,查询请求标识信息(1)映射到键值服务器1,查询请求标识信息(2)映射到键值服务器1,...,查询请求标识信息(m)映射到键值服务器1,由此可见查询请求标识信息(1)、查询请求标识信息(2)、...、查询请求标识信息(m)都映射到键值服务器1,所以将映射到键值服务器1的用户查询请求合并成同一个查询请求即用户查询请求(查询请求标识信息(1)、查询请求标识信息(2)、...、查询请求标识信息(m))映射到键值服务器1。同理,查询请求标识信息(n)映射到键值服务n,...,查询请求标识信息(z)映射到键值服务器n,所以将映射到键值服务器n的用户查询请求合并成同一个查询请求即用户查询请求(查询请求标识信息(n)、...、查询请求标识信息(z))映射到键值服务器n。
还有,根据查询请求标识信息确定键值服务器的映射规则是采用Mod取余数算法或者一致性哈希Hash算法。该映射规则用于指定将查询请求标识信息保存到键值***中哪一个键值服务器上。
取余数Mod算法:将查询请求标识信息除以服务器的数量n得到的余数,这个余数表示提供服务的键值服务器的编号。
一致性Hash算法:首先求出每个服务器节点的哈希Hash值,并将其配置到一个0-232圆环区间上(如果服务器节点的数量比较少,那么一个服务器节点在环上生成多个映射点即虚拟节点来增加数量)。其次将查询请求标识信息也将其配置到这个圆环上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务节点上。如果超过232仍然找不到服务器节点,就会保存到第一个服务器节点上。一致性哈希算法最大程度的避免了文本在服务节点列表上的重新分布,其他附带的改进就是有的一致性哈希算法还增加了虚拟服务器节点的方法,也就是一个服务器节点在环上有多个映射点,这样就能抑制分布不均匀,最大限度地减小服务节点增减时的缓存重新分布。
(2)从无锁连接池取得连接。无锁连接池为取连接的合并的多个查询请求标识信息分配编号,编号标识连接在集合中的索引位置;索引位置的变化通过原子变量更新,如果连接不归还则强制断开连接。具体地,该无锁连接池是不通过加锁Lock-free这种阻塞的方式来取得的,首先,每一个来取连接的请求都会分配一个“编号”,这个编号是连接在集合中的索引位置;索引位置的变化是通过硬件支持的原子变量(CompareAndSet,CAS)来更新,现有的处理器提供了特殊的指令可以自动更新共享数据(提供了原子性的读-写-修改操作),而且能够检测到其他线程的干扰。该连接是基于“有一个保存连接池的数组,所有的存取操作都是原子性的”,所以不需要加锁;然后,建立合并的查询请求与索引位置之间的连接;最后,若建立的连接长时间不归还,则强制断开该连接。该无锁连接池技术不需要保存已被引用的连接,所以即使不归还连接也不会导致“内存泄露”,但归还了后被复用性能会很好。其中,“内存泄露”是特指被借用的连接没有归还,不但导致该连接不能被其他请求使用而且还一直占用内存。
(3)将合并的查询请求标识信息并行发送到键值服务器做查询。
步骤604:查询键值服务器并判断是否查到查询请求标识信息。
具体地,根据多个查询请求标识信息查询键值服务器。在键值服务器中查询会出现两种查询结果,若查到查询请求标识信息,则到步骤607,若没有查到查询请求标识信息,则到步骤605。
步骤605:在查询数据库查询查询请求标识信息并判断是否查到查询请求标识信息。
具体地,当确定键值服务器中没有查询到查询请求标识信息,则在分布式数据库中查询查询请求标识信息。根据多个查询请求标识信息查询数据库。在数据库中查询会出现两种查询结果,若查到查询请求标识信息,则到步骤607,若没有查到查询请求标识信息,则到步骤606。
步骤606:将查询结果信息为空信息返给用户。
具体地,在分布式数据库中没有查询到查询请求标识信息,则返回用户的查询结果信息是空信息,也就是表明没有查询到匹配的文本信息。
步骤607:将查询请求标识信息对应的文本信息返给用户。
具体地,在白名单、键值服务器和数据库的任何一个中查询到查询请求标识信息,则将查询请求标识信息对应的文本信息为查询请求信息Key对应的查询结果信息,该文本信息是用户查询请求标识信息所标志的唯一的一段文本信息,并将携带多个查询结果信息的键值数据发送给用户。
因此,本申请实施例公开的另一键值数据查询方法,接收携带多个查询请求信息的键值数据,查询请求信息为ID,查询结果信息为文本信息;而本申请实施例公开的一键值数据查询方法中,查询请求信息为文本信息,查询结果信息为唯一的ID。由此可见,本申请实施例公开的两种方法可以实现对查询请求信息的互查。
图8为本申请实施例公开的一键值数据查询装置示意图,如图所示,本实施例具体包括:接收单元10、白名单查询单元11、第一标识信息单元12、合并单元13、键值服务器查询单元14、第二标识信息单元15、保存单元16和发送单元17。
接收单元10用于接收携带多个查询请求信息的键值数据,所述查询请求信息为第一信息。其中,第一信息在本申请实施例中为文本信息,在此称为第一文本信息。但是,第一信息并不限于使用文本信息这种类型,还包括其他类型的查询请求信息,比如图片信息、视频信息等。
白名单查询单元11用于根据键值数据中携带的第一文本信息查询白名单。
第一标识信息单元12用于当确定白名单中没有查询到第一文本信息,则将多个第一文本信息生成与多个第一文本信息相对应的多个第一标识信息,并确定多个第一标识信息的键值服务器。
合并单元13用于将确定为同一个键值服务器的多个第一标识信息合并,并向键值服务器查询合并的多个第一标识信息;
键值服务器查询单元14用于在键值服务器中查询合并的多个第一标识信息。
第二标识信息单元15用于当确定键值服务器中或者数据库中查询到第一标识信息,并且第一标识信息对应的文本信息与第一文本信息不同时,将第一文本信息生成第二标识信息。
保存单元16用于将第一文本信息和由第一文本信息生成的第二标识信息存入白名单中。
发送单元17用于发送携带多个查询结果信息的键值数据。
因此,本申请实施例公开的一键值数据查询装置,接收用户发送来的携带多个查询请求信息Key的键值数据,该查询请求信息为第一文本信息。采用11位字符将第一文本信息转为第一标识信息,调用自增长***将第一文本信息转为第二标识信息保存在白名单中,从而保证将第一文本信息生成ID的唯一性,也保证了查询结果信息的唯一性。将确定为同一个键值服务器的多个第一标识信息合并,采用无锁连接池技术,从无锁连接池中取得连接。与有“锁”连接池技术相比,无锁连接池技术大幅度降低取连接地成本,提高了并发取连接的性能,缩短了该装置的响应时间,提高了该装置的查询速度。
值得指出的,采用将第一文本信息转为11位字符的第一标识信息,这样能够保证不同的第一文本信息生成相同的第一标识信息的概率非常低,只有当保存的数据量达到了13亿时才可能发生第一次重复;若出现了不同的第一文本信息生成相同的第一标识信息的情况,采用调用自增长***将第一文本信息转为第二标识信息保存在白名单中,从而保证了该装置的查询结果信息的唯一性,并使得该装置在十亿级别数据量的应用场景下用11个字符能保证生成唯一性的标识信息ID。
图9为本申请实施例公开的另一键值数据查询装置示意图如图所示,本实施例具体包括:接收单元10、白名单查询单元11、合并单元12、键值服务器查询单元13和发送单元14。
接收单元10用于接收携带多个查询请求信息的键值数据,其中,查询请求信息为查询请求标识信息,该查询请求标识信息在本申请实施例中为标识文本信息的ID。但是,查询请求信息不只限于使用标志文本信息的ID,还包括标志其他类型查询请求信息的ID,比如标志图片信息、视频信息等查询请求信息的ID。
白名单查询单元11用于根据键值数据中携带的查询请求标识信息查询白名单。
合并单元12用于当确定白名单中没有查询到查询请求标识信息,则确定查询请求标识信息的键值服务器;将同一个键值服务器的多个查询请求标识信息合并,并向键值服务器查询合并的多个查询请求标识信息。
键值服务器查询单元13用于在键值服务器中查询合并的多个查询请求标识信息;当确定键值服务器中查询到查询请求标识信息,则查询请求标识信息对应的文本信息为查询请求信息对应的查询结果信息。
发送单元14用于发送携带多个查询结果信息的键值数据。
因此,本申请实施例公开的另一键值数据查询装置,接收携带多个查询请求信息的键值数据,查询请求信息为ID,查询结果信息为文本信息,而本申请实施例公开的一键值数据查询装置,查询请求信息为文本信息,查询结果信息为唯一的ID。由此可见,本申请实施例公开的两种装置可以实现对查询请求信息的互查。
总之,本申请实施例公开的键值数据查询的方法和装置实现了对海量键值数据进行高速批量查询,采用白名单保证了生成ID的唯一性并采用合并查询和无锁连接池使得处理的数据量有很大的增加以及响应时间有很大提高。
专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本申请中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。