具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
为了使本申请实施例更加便于理解,首先对本申请实施例可能的应用场景进行举例说明。例如,本申请实施例可以应用于与用于存储缓存数据的一台或多台缓存服务器不同的单独的查询服务器中。其中,缓存服务器中保存了由酒店ID与日期值组成的关键字与缓存数据的映射。应用本申请实施例提供的方法的查询服务器可以接收针对酒店ID与日期值分别在各自指定范围的“与”/“或”的关系范围查询请求,得到与关系返查询请求对应的关键字集合。例如,可以查询出酒店ID在7到32范围内且日期范围在20140701到20140731内的关键字集合,进而可以从多台缓存服务器中取得酒店ID在7到32范围内且日期范围在20140701到20140731内的关键字对应的缓存数据。
下面,结合上述可能的应用场景,对本申请实施例提供的分布式缓存范围查询方法及装置进行详细说明。
例如,参见图1,为本申请实施例提供的分布式缓存范围查询方法流程示意图。如图1所示,该方法可以包括:
S110、将用于映射缓存数据的关键字中,可用于范围查询的字段值对应的标识值,预先存储在内存的存储区域中,且,为每个标识值分别建立对应的原始关键字集合,其中,所述原始关键字集合由包含有该标识值对应的字段值的关键字组成。
例如,为了减少节点环中的节点数量,提高查询效率,可以将所有关键字属于同一字段的字段值中重复的部分剔除,仅将同一字段的取值不同的字段值预先存储在内存的一个存储区域中。
其中,位于内存的存储区域的存储结构不限,例如,可以是单向链表、数组、环状链表等。例如,一些可能的实施方式中,可以将所述关键字中,可用于范围查询的一种字段值对应的标识值,预先存储在位于内存的节点环(即,环状链表)中,其中,一种字段值对应一个节点环,一个标识值对应存储到节点环的一个节点中,且为所述节点环中的每一节点建立对应的路由表,所述路由表记录了根据预置索引算法确定的一个或多个其他节点的标识值。其中,所述为每个标识值分别建立对应的原始关键字集合的具体实现可以为:为每个存储标识值的节点分别建立对应的原始关键字集合。可以理解的是,属于同一字段的取值不同的字段值可以认为是一种字段值。
一些可能的实施方式中,所述预置索引算法可以为:用一个路由表来记录节点环中与该路由表对应的节点的标识值间距成2的幂次方关系的标识值。相应的,步骤S110具体可以为:将关键字中,可用于范围查询的、属于同一字段的字段值对应的标识值按标识值大小顺序预先存储在位于内存的一个节点环中,其中,所述路由表记录了所述节点环中与对应节点的标识值间距成2的幂次方关系的标识值。通常而言,由于缓存数据中可用于范围查询的字段值所对应的标识值通常是相差不大的值,路由表中记录与一节点的标识值间距成2的幂次方关系的标识值对应的节点,可便于后续的查找,提高查找效率。
当然,预置索引算法不仅限于上面实施方式中这一种,具体可以根据实际查询效率需要进行设置,本申请对此并不进行限制。例如,所述预置索引算法还可以为:用路由表来记录节点环中与该路由表对应的节点的标识值间距为指定常量整数倍的标识值,等等。
可以理解的是,key(关键字)可以由各种字段不同的字段构成,其中,可用于范围查询的字段可以包括如,数字、日期等字段。例如,如果需要对日期做范围查询,则可以从各个关键字中提取出日期值,将提取出的不同日期值对应转换为可以根据预置索引算法运算的标识值。结合上面节点环的实施方式,则可以将标识值以链表的形式存储为首尾相连的、按日期值大小顺序排序的节点环。例如,原始关键字为“date-2014年08月07日-hotelId-18873”,关键字体现了日期与酒店id对应关系,日期“2014年08月07日”可以转换为标识值140807。其中,按标识值大小顺序排序具体为按字段值从小到大顺序排序,也可以为从大到小顺序排序。
S120、响应于接收到关系范围查询请求,其中,所述关系范围查询请求携带至少两种字段值的指定范围,以及所述至少两种字段值应满足的指定关系,从所述存储区域中查找出所述至少两种字段值中至少一种字段值的指定范围的端点值对应的标识值。
例如,在标识值存储在节点环的实施例中,可以以所述至少一种字段值对应的节点环中的任一节点作为当前节点,在所述当前节点的路由表中查找出距所述至少一种字段值对应的指定范围的端点值最近的标识值;如果判定查找到的标识值是所述至少一种字段值对应的节点环中距所述至少一种字段值对应的指定范围的端点值最近的标识值,将查找到的标识值作为所述至少一种字段值对应的指定范围的端点值对应的标识值;如果判定查找到的标识值不是所述至少一种字段值对应的节点环中距所述至少一种字段值对应的指定范围的端点值最近的标识值,将当前节点更新为查找到的标识值所在的节点,返回到所述在当前节点的路由表中查找距所述至少一种字段值对应的指定范围的端点值最近的标识值的步骤。
可以理解的是,在指定关系为与关系的情况下,只要取得所述至少两种字段值中任一种字段值对应的节点环,即可从该节点环中取得所述至少两种字段值同时在对应的指定范围内的关键字。当然,也可以取得所述至少两种字段值中任意多个字段值对应的节点环,同样可以从中查找出所述至少两种字段值同时在对应的指定范围内的关键字。在指定查询条件为或查询条件的情况下,则需要取得所述至少两种字段值中每种字段值分别对应的节点环,这样,才能取得每种字段值在指定范围内的关键字集合以便取其并集。
例如,如图2所示,结合上述查询酒店ID在7到32范围内且日期范围在20140701到20140731的关键字的应用场景,可以取得查询所需要的酒店ID对应的节点环201、日期对应的节点环202。
可以理解的是,指定范围可以包括一个或多个指定范围,端点值可以为用于确定指定范围区间的端点值。例如,指定日期范围可以包括:2001年1月1日到2001年5月1日,以及,2002年1月1日到2002年5月1日。则端点值可以包括:010101与010501、020101与020501。
需要说明的是,所述端点值对应的标识值可以是与所述端点值相等的标识值,在不存在与所述端点值相等的标识值的情况下,可以是节点环中在所述指定范围内与所述端点值最近的标识值。
例如,结合上述查询酒店ID在7到32范围内且日期范围在20140701到20140731的关键字的应用场景,可以在图2所示的酒店ID对应的节点环201中查找出酒店ID范围7到32的端点值在节点环201中对应的标识值分别为8以及30,可以在图2所示的日期对应的节点环202中查找出日期范围20140701到20140731的端点值在节点环202中对应的标识值分别为20140703以及20140728。
S130、根据所述至少一种字段值的指定范围的端点值对应的标识值,查找出所述至少一种字段值的指定范围内的所有标识值对应的原始关键字集合。
例如,结合上述查询酒店ID在7到32范围内且日期范围在20140701到20140731的关键字的应用场景,根据酒店ID范围7到32的端点值在节点环201中对应的标识值分别为8以及30,日期范围20140701到20140731的端点值在节点环202中对应的标识值分别为20140703以及20140728,从节点环201中查找出节点8、10、16、21、28、30分别对应的原始关键字集合,从节点环202中查找出节点20140703、20140715、20140722、20140728分别对应的原始关键字集合。
S140、从查找出的原始关键字集合中,查找出所述至少两种字段值满足所述指定关系的关键字,得到所述关系范围查询请求对应的关键字集合。
例如,如果所述指定关系为或的关系,则可以从存储区域中查找出所述至少两种字段值中每种字段值的指定范围的端点值对应的标识值。相应地,可以将所述至少两种字段值中每种字段值的指定范围内的所有标识值对应的原始关键字集合进行合并,得到所述关系范围查询请求对应的关键字集合。
再例如,如果所述指定关系为与的关系,则可以从存储区域中查找出所述至少两种字段值中任一种或多种字段值的指定范围的端点值对应的标识值。相应地,可以从所述至少两种字段值中任一种或多种字段值的指定范围内的所有标识值对应的原始关键字集合中,查找出所述至少两种字段值同时在对应的指定范围内的关键字,得到所述关系范围查询请求对应的关键字集合。
结合上述查询酒店ID在7到32范围内且日期范围在20140701到20140731的关键字的应用场景,可以对节点8、10、16、21、28、30分别对应的原始关键字集合,以及节点20140703、20140715、20140722、20140728分别对应的原始关键字集合进行取交集运算。
例如,一些可能的实施方式中,本申请实施例提供的方法可以应用于与存储缓存数据的一台或多台缓存服务器不同的单独的查询服务器中,相应地,所建立的可用于范围查询的节点环以及路由表均可以保存于该查询服务器。在查询服务器得到所述关系范围查询请求对应的关键字集合之后,还可以进一步通过一次多线程下载并发从所述一台或多台缓存服务器中得到所述关键字集合对应的缓存数据,将得到的缓存数据返回给发出所述关系范围查询请求的客户端。
可见,应用本申请实施例提供的方法,在接收到关系范围查询请求后,从所述存储区域中查找出指定范围的端点值对应的标识值的查询可以全部在内存中完成,而且,可以根据所述至少一种字段值的指定范围的端点值对应的标识值,查找出所述至少一种字段值的指定范围内的所有标识值对应的原始关键字集合,从查找出的原始关键字集合中,查找出所述至少两种字段值满足所述指定关系的关键字,得到所述关系范围查询请求对应的关键字集合无需访问数据库,从而实现了与数据库解耦的多级范围查询。
下面,对路由表用于记录节点环中与对应节点的标识值间距成2的幂次方关系的标识值的实施例进行详细说明。例如,该实施例可以包括:
S310、将关键字中,可用于范围查询的、属于同一字段的字段值对应的标识值按标识值大小顺序预先存储在位于内存的一个节点环中,其中,一种字段值对应一个节点环,一个标识值对应存储到节点环的一个节点中,且为所述节点环中的每一节点建立对应的路由表,为每个存储标识值的节点分别建立对应的原始关键字集合,所述路由表记录了所述节点环中与对应节点的标识值间距成2的幂次方关系的标识值。
其中,间距成2的幂次方关系的标识值可以指,间距等于2i-1的节点的标识值,以及,当不存在间距等于2i-1的标识值时,间距最接近2i-1的节点标识值。例如,在一些可能的实施方式中,为了尽量拉开合适的间距以提高查询效率,间距最接近2i-1的标识值可以取间距大于2i-1的标识值中,间距最接近2i-1的标识值,其中,i为整数,且大于等于1、小于等于所述节点环中节点的最大标识值取2的对数再向上取整的得数。
例如,如图2所示的节点环,其中,节点旁边标注的2、8、10、16等数字为用于标识节点的标识值。如图2所示的节点环中的每个节点维护了一个m项的路由表。其中,标识值以二进制来表示的话,m为节点环中最大的二进制标识值的位数。若L表示环中字段值最大的节点,则m为L取2对数向上取整。即:如图2所示,需要将所有节点分布到环上,m的取值应该为6。在每个节点维护的m项路由表中,路由表的第i项纪录的标识值等于:
successor((该节点的标识值+2i-1)mod2m),(1≤i≤m)。
由于路由表记录了与对应节点的标识值间距成2的幂次方关系的标识值,因此,每个节点的直接后继节点为其路由表的第一项。为了便于下面查询指定范围对应的端点节点,节点环中每一节点同时还维护自身的直接前驱节点。在本申请实施例中,由于路由表记录的标识值的间隔以指数增长,路由表中记录的与对应节点临近的节点的密度比远端节点的密度大,所以,在下面以路由表为索引查询指定范围对应的端点节点过程中,如果指定范围的端点离当前节点的标识值较远,则可以根据路由表记录的较为稀疏的远端节点快速跳到更远的节点进行查询,如果指定范围的端点离当前节点的标识值较近,则可以根据路由表记录的较为密集的临近的节点更加准确地跳到更加接近端点节点的节点上进行查询。因此,通过本申请实施例为节点建立的路由表,可以进行高效的范围查询。
S320、响应于接收到关系范围查询请求,以所述至少两种字段值中至少一种字段值对应的节点环中的任一节点作为当前节点。
S330、在所述当前节点的路由表中查找出距所述至少一种字段值对应的指定范围的端点值最近的标识值。
S340、如果判定查找到的标识值是所述至少一种字段值对应的节点环中距所述至少一种字段值对应的指定范围的端点值最近的标识值,将查找到的标识值作为所述至少一种字段值对应的指定范围的端点值对应的标识值。
S350、如果判定查找到的标识值不是所述至少一种字段值对应的节点环中距所述至少一种字段值对应的指定范围的端点值最近的标识值,将当前节点更新为查找到的标识值所在的节点,返回到所述在当前节点的路由表中查找距所述至少一种字段值对应的指定范围的端点值最近的标识值的步骤。
下面,结合标识值对应的节点在节点环中按标识值从小到大的顺序排序的实施方式,对本申请实施例上述步骤S320-S350可能的实施方式进行详细说明。例如,在该实施方式中,所述至少一种节点值中某种节点值对应的指定范围可以为第一端点值到第二端点值之间的范围,其中,所述第一端点值小于第二端点值,S320-S350可能的查询步骤可以包括:
在接收到查询请求时,可以将该种节点值对应的节点环中任一节点作为当前节点。
判断所述当前节点的路由表记录的字段值中是否存在与所述第一端点值相等的标识值。
如果是,则将与所述第一端点值相等的标识值作为所述第一端点值对应的标识值。
如果否,判断所述第一端点值是否在所述当前节点的标识值与其直接前驱节点或直接后继节点的标识值之间。
可以理解的是,如果端点值在所述当前节点的标识值与其直接前驱节点或与其直接后继节点的标识值之间,则说明在节点环中不存在与端点值相等的标识值,只能在当前节点、当前节点的直接前驱节点或直接后继节点中选择出所述端点值对应的标识值,具体可以依据端点值是范围的起始端点还是终止端点来选择。如果端点值不在所述当前节点的标识值与其直接前驱节点或与其直接后继节点的标识值之间,则说明节点环中其他位置可能存在与端点值相等的标识值,则可以跳到当前节点的路由表中记录的距所述端点值最近的标识值所在的节点,继续进行判断。
如果所述第一端点值在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点的标识值作为所述第一端点值对应的标识值。
如果所述第一端点值在所述当前节点的标识值与其直接后继节点的标识值之间,则将所述当前节点的直接后继节点的标识值作为所述第一端点值对应的标识值。
如果所述第一端点值不在所述当前节点的标识值与其直接后继节点的标识值之间,且不在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点更新为所述当前节点的路由表中记录的距所述第一端点值最近的标识值所标识的节点,返回到所述判断当前节点的路由表记录的标识值中是否存在与所述第一端点值相等的标识值的步骤。
判断所述当前节点的路由表记录的标识值中是否存在与所述第二端点值相等的标识值。
如果是,则将等于所述第二端点值的标识值作为所述第二端点值对应的标识值。
如果否,判断所述第二端点值是否在所述当前节点的标识值与其直接前驱节点或直接后继节点的标识值之间。
如果所述第二端点值在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点的直接前驱节点的标识值作为所述第二端点值对应的标识值。
如果所述第二端点值在所述当前节点的标识值与其直接后继节点的标识值之间,则将所述当前节点的标识值作为所述第二端点值对应的标识值。
如果所述第二端点值不在所述当前节点的标识值与其直接后继节点的标识值之间,且不在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点更新为所述当前节点的路由表中记录的距所述第二端点值最近的标识值所标识的节点,返回到所述判断当前节点的路由表记录的标识值中是否存在与所述第二端点值相等的标识值的步骤。
需要说明的是,针对第一端点值对应的标识值以及第二端点值对应的标识值的查询可以同时并发执行,也可以先后执行,本申请实施例针对不同端点值的标识值的查询执行顺序并无限制。
下面,结合图2所示节点环,以查询酒店ID范围7到32的标识值为例对上述查询步骤进行示意性说明。可以理解的是,在此以数字举例仅为便于理解,如果可用于范围查询的字段值是非数字类型的,可以将非数字类型的字段值转换为数字类型的标识值。例如,可以首先从节点2出发,根据7在节点2与节点2的直接后继节点8之间,确定节点环中不存在标识值为7的节点。所以7对应的标识值为节点8。然后,从节点8出发,根据节点8的路由表中与节点32最接近的节点为节点28,跳到节点28的路由表进行查询,查询节点28的路由表信息,根据与32最接近的节点为节点30,跳到节点30的路由表进行查询,根据32位于节点30与其直接后继节点33之间,确定节点环中不存在标识值为32的节点。所以32对应的标识值为30。从而,根据如图2所示的节点环,在指定范围的起始标识值为8,结束标识值为30。
S360、根据所述至少一种字段值的指定范围的端点值对应的标识值,查找出所述至少一种字段值的指定范围内的所有标识值对应的原始关键字集合。
例如,结合酒店ID范围7到32的标识值为8和30的例子,查找出的酒店ID范围7到32内的标识值可以包括:8、10、16、21、28、30,进而得到节点8、10、16、21、28、30分别对应的原始关键字集合。查询日期范围20140701到20140731的标识值的实施方式与上面实施方式类似,在此不再赘述。例如,根据查询出的标识值20140703以及20140728,可以得到节点20140703、20140715、20140722、20140728分别对应的原始关键字集合。
S370、从查找出的原始关键字集合中,查找出所述至少两种字段值满足所述指定关系的关键字,得到所述关系范围查询请求对应的关键字集合。
例如,节点8,10,16,21,28,30分别对应的原始关键字集合,以及节点20140703,20140715,20140722,20140728分别对应的原始关键字集合可以如图4所示。根据图4所示,节点8和30与日期节点20140715的原始关键字集合存在交集,节点10和21与日期节点20140722的原始关键字集合也存在交集,对酒店ID范围7到32对应的原始关键字集合与日期范围20140701到20140731对应的原始关键字集合进行交集运算就可以得到指定关系为“与关系”的关系范围查询请求对应的关键字集合。例如,得到的关键字集合为20140715-8、20140715-30、20140722-10、20140722-21。同理,这两个范围对应的原始关键字集合进行并集运算,可以得到指定关系为“或关系”的关系范围查询请求对应的关键字集合。
可见,应用该实施例,可以直接从内存读取节点环,以节点环中节点的路由表作为索引进行范围查询,脱离对数据库的依赖、读取速度快,且在根据路由表查找指定范围的端点值对应的标识值的过程中,总是跳到距端点值最近的标识值所在的节点的路由表中来查找,最终查找出关系范围查询请求对应的关键字集合,从而使查询过程成为折半查找的过程,达到高效范围查询的目的。例如,以一亿个节点为例,L=100,000,000,那么每个节点需要维护的路由表项数为log2L=27,查询其中任意一个节点需要经历的跳数最多为logL=8,所以,查询的性能是非常高的。
另外,对于分布式缓存***来说,缓存的关键字可能在任何时候加入或者删除。与此同时,为了保证节点环以及路由表与缓存中的关键字一致,需要在节点需要同时在带有路由表的节点环中加入或删除。具体地,本申请实施例还可以包括:
针对缓存中新加入的关键字,判断新加入的关键字中可用于范围查询的字段值对应的标识值是否已存在于所述节点环中,如果是,将所述新加入的关键字加入所述可用于范围查询的字段值对应的标识值的原始关键字集合中,如果否,将所述新加入的关键字中可用于范围查询的字段值对应的标识值存储在新节点中,在所述节点环中查找出可作为新节点的直接前驱节点的节点N,更新所述节点N的直接后继节点的直接前驱节点为所述新节点,更新所述节点N为所述新节点的直接前驱节点,为所述新节点建立对应的路由表。
针对缓存中删除的关键字,如果所述删除的关键字的字段中可用于范围查询的字段值不存在于任何其他关键字中,将存储了该字段值对应的标识值的节点作为待删除节点,更新待删除节点的直接后继节点的直接前驱节点为所述待删除节点的直接前驱节点,从所述节点环中删除所述待删除节点;如果其他节点环的原始关键字集合中存在所述删除的关键字,将所述删除的关键字从所述其他节点环的原始关键字集合中删除。
以及,根据预置索引算法,对受所述新节点的加入影响或受所述待删除节点的删除影响而需要更新的路由表进行更新。
下面,对如何进行路由表的更新进行举例说明。例如:结合上述路由表的第i项的标识值等于successor((该节点的标识值+2i-1)mod2m),(1≤i≤m)的实施方式,如果节点环中新加入节点P,则可以通过以下步骤对受P加入影响而需要更新的路由表进行更新:
根据第i项的标识值等于successor((该节点的标识值+2i-1)mod2m),对节点P的前驱节点的路由表记录的信息进行递归更新,直到递归到的前驱节点不能同时满足更新的两个条件,递归终止。其中所述两个条件为:条件一:递归到的前驱节点S与节点P之间标识值的间距大于等于2i-1。因为如果节点S与节点P之间标识值的距离小于2i-1,则节点S路由表的第i项一定在节点P之后,所以路由表第i项不需要更新。条件二:在满足条件一的前提下,节点S的路由表当前第i项需要在节点P之后。因为如果节点S的路由表信息第i项在节点P之前。说明P节点是当前第i项之后的节点,不需要更新路由表当前项。
根据上述两个条件的判断,可以准确地沿环节点预设排序顺序相反方向递归更新新加入节点的前驱节点的路由表信息。由于受删除节点影响而对路由表的更新与上述受新加入节点的影响而对路由表的更新的原理相同,在此不再赘述。因为***或者删除节点,不会对当前节点的后继节点的路由表产生影响,只会影响当前节点的前驱节点。这就要求每个节点除了需要维护路由表信息外,也需要维护直接前驱节点。在递归更新过程中,如果节点S需要更新路由表的第i项,那么节点S的直接前驱节点也可能需要更新路由表信息,反之,如果节点S不需要更新路由表信息,则S的前驱节点也不需要更新路由表信息。递归更新路由表信息结束。
例如,如图2所示,新加入节点为节点30,沿环节点逆时针方向递归更新节点30的前驱节点的路由表信息,从前驱节点28一直递归更新到节点16。如图2所示,节点28路由表的第1项,第2项从33更新为30。由于更新到节点16时,不同时满足更新路由表的两个条件,节点16的路由表信息没有发生变化,因此,结束递归更新。
与本申请实施例提供的分布式缓存范围查询方法对应的,本申请实施例还提供了一种分布式缓存范围查询装置。
例如,参见图5,为本申请实施例提供的分布式缓存范围查询装置结构示意图。如图5所示,该装置可以包括:
预处理单元510,可以用于将用于映射缓存数据的关键字中,可用于范围查询的字段值对应的标识值,预先存储在内存的存储区域中,且,为每个标识值分别建立对应的原始关键字集合,其中,所述原始关键字集合由包含有该标识值对应的字段值的关键字组成。
查询响应单元520,可以用于响应于接收到关系范围查询请求,其中,所述关系范围查询请求携带至少两种字段值的指定范围,以及所述至少两种字段值应满足的指定关系,从所述存储区域中查找出所述至少两种字段值中至少一种字段值的指定范围的端点值对应的标识值。
范围值获取单元530,可以用于根据所述至少一种字段值的指定范围的端点值对应的标识值,查找出所述至少一种字段值的指定范围内的所有标识值对应的原始关键字集合。
关键字获取单元540,可以用于从查找出的原始关键字集合中,查找出所述至少两种字段值满足所述指定关系的关键字,得到所述关系范围查询请求对应的关键字集合。
其中,所述预处理单元510,具体可以用于将所述关键字中,可用于范围查询的一种字段值对应的标识值,预先存储在位于内存的节点环中,其中,一种字段值对应一个节点环,一个标识值对应存储到节点环的一个节点中,且为所述节点环中的每一节点建立对应的路由表,所述路由表记录了根据预置索引算法确定的一个或多个其他节点的标识值。
一些可能的实施方式中,所述查询响应单元520可以包括:
查找子单元521,可以用于响应于接收到关系范围查询请求,以所述至少一种字段值对应的节点环中的任一节点作为当前节点,在所述当前节点的路由表中查找出距所述至少一种字段值对应的指定范围的端点值最近的标识值。第一判定子单元522,可以用于如果判定查找到的标识值是所述至少一种字段值对应的节点环中距所述至少一种字段值对应的指定范围的端点值最近的标识值,将查找到的标识值作为所述至少一种字段值对应的指定范围的端点值对应的标识值。第二判定子单元523,可以用于如果判定查找到的标识值不是所述至少一种字段值对应的节点环中距所述至少一种字段值对应的指定范围的端点值最近的标识值,将当前节点更新为查找到的标识值所在的节点,触发所述查找子单元在当前节点的路由表中查找距所述至少一种字段值对应的指定范围的端点值最近的标识值。
一些可能的实施方式中,所述预处理单元510,具体可以用于将关键字中,可用于范围查询的、属于同一字段的字段值对应的标识值按标识值大小顺序预先存储在位于内存的一个节点环中,其中,一种字段值对应一个节点环,一个标识值对应存储到节点环的一个节点中,且为所述节点环中的每一节点建立对应的路由表,所述路由表记录了所述节点环中与对应节点的标识值间距成2的幂次方关系的标识值。
下面,对所述路由表记录了所述节点环中与对应节点的字段值间距成2的幂次方关系的字段值的实施方式进行详细说明。假设所述节点环中的节点按标识值从小到大的顺序排序,所述至少一种节点值中某种节点值对应的指定范围可以为第一端点值到第二端点值之间的范围,其中,所述第一端点值小于第二端点值。针对第一端点值对应的标识值的查询,本申请实施例所述查找子单元521,如图6所示,可以包括:
出发子单元5210,可以用于在接收到查询请求时,将该种节点值对应的节点环中任一节点作为当前节点。
第一端点判断子单元5211,可以用于判断所述当前节点的路由表记录的标识值中是否存在与所述第一端点值相等的标识值。
第一端点确定子单元5212,可以用于如果所述第一端点判断子单元5211判定存在,则将与所述第一端点值相等的标识值作为所述第一端点值对应的标识值。
第一端点续判子单元5213,可以用于如果所述第一端点判断子单元5211判定不存在,判断所述第一端点值是否在所述当前节点的标识值与其直接前驱节点或直接后继节点的标识值之间。
第一端点续定子单元5214,可以用于如果所述第一端点续判子单元5213判定所述第一端点值在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点的标识值作为所述第一端点值对应的标识值;如果所述第一端点续判子单元5213判定所述第一端点值在所述当前节点的标识值与其直接后继节点的标识值之间,则将所述当前节点的直接后继节点的标识值作为所述第一端点值对应的标识值。
其中,所述第二判定子单元523,可以用于如果所述第一端点续判子单元5213判定所述第一端点值不在所述当前节点的标识值与其直接后继节点的标识值之间,且不在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点更新为所述当前节点的路由表中记录的距所述第一端点值最近的标识值所在的节点,重新触发所述第一端点判断子单元5211执行。
针对第二端点值对应的标识值的查询,本申请实施例所述查找子单元521,如图6所示,还可以包括:
第二端点判断子单元5215,可以用于判断所述当前节点的路由表记录的标识值中是否存在与所述第二端点值相等的标识值。
第二端点确定子单元5216,可以用于如果所述第二端点判断子单元5215判定存在,则将与所述端点值相等的标识值作为所述节点环中距所述第二端点值最近的标识值。
第二端点续判子单元5217,可以用于如果所述第二端点判断子单元5215判定不存在,判断所述第二端点值是否在所述当前节点的标识值与其直接前驱节点或直接后继节点的标识值之间。
第二端点续定子单元5218,可以用于如果所述第二端点续判子单元5217判定所述第二端点值在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点的直接前驱节点作为所述节点环中距所述第二端点值最近的标识值;如果所述第二端点续判子单元5217判定所述第二端点值在所述当前节点的标识值与其直接后继节点的标识值之间,则将所述当前节点的标识值作为所述节点环中距所述第二端点值最近的标识值。
其中,所述第二判定子单元523,可以用于如果所述第二端点续判子单元5217判定所述第二端点值不在所述当前节点的标识值与其直接后继节点的标识值之间,且不在所述当前节点的标识值与其直接前驱节点的标识值之间,则将所述当前节点更新为所述当前节点的路由表中记录的距所述第二端点值最近的标识值所在的节点,重新触发所述第二端点判断子单元5215执行。
下面,再对本申请实施例在节点环中加入或删除节点的具体实施方式进行介绍。例如,本申请实施例提供的装置还可以包括:
节点加入单元550,可以用于针对缓存中新加入的关键字,判断新加入的关键字中可用于范围查询的字段值对应的标识值是否已存在于所述节点环中,如果是,将所述新加入的关键字加入所述可用于范围查询的字段值对应的标识值的原始关键字集合中,如果否,将所述新加入的关键字中可用于范围查询的字段值对应的标识值存储在新节点中,在所述节点环中查找出可作为新节点的直接前驱节点的节点N,更新所述节点N的直接后继节点的直接前驱节点为所述新节点,更新所述节点N为所述新节点的直接前驱节点,为所述新节点建立对应的路由表;
节点删除单元551,可以用于针对缓存中删除的关键字,如果所述删除的关键字的字段中可用于范围查询的字段值不存在于任何其他关键字中,将存储了该字段值对应的标识值的节点作为待删除节点,更新待删除节点的直接后继节点的直接前驱节点为所述待删除节点的直接前驱节点,从所述节点环中删除所述待删除节点;如果其他节点环的原始关键字集合中存在所述删除的关键字,将所述删除的关键字从所述其他节点环的原始关键字集合中删除。
以及,路由更新单元552,可以用于根据预置索引算法,对受所述新节点的加入影响或受所述待删除节点的删除影响而需要更新的路由表进行更新。
下面,再结合本发明实施例一些可能的应用场景进行示意性说明。
例如,一些可能的实施方式中,根据一致性hash规则,可以在分布式缓存***的一台或多台缓存服务器存储有各个节点的kay-value信息。为了提高查询性能,本申请实施例提供的装置可以配置于与用于存储缓存数据的一台或多台缓存服务器不同的单独的查询服务器中。相应地,该装置还可以包括:数据反馈单元560,可以用于在关键字获取单元得到所述关系范围查询请求对应的关键字集合之后,通过一次多线程下载并发从所述一台或多台缓存服务器中得到所述关键字集合对应的缓存数据,将得到的缓存数据返回给发出所述关系范围查询请求的客户端。
可见,配置本申请实施例提供的装置,可以由查询响应单元520直接从内存读取该节点环,以节点环中节点的路由表作为索引进行范围查询,脱离对数据库的依赖、读取速度快,且在根据路由表查找指定范围的端点值对应的标识值的过程中,总是跳到距端点值最近的标识值所在的节点的路由表中来查找,最终使得关键字获取单元540可以查找出关系范围查询请求对应的关键字集合,从而使查询过程成为折半查找的过程,达到高效范围查询的目的。
需要注意的是,本申请实施例所述查找子单元521,第一判定子单元522、第二判定子单元523、出发子单元5210、第一端点判断子单元5211、第一端点确定子单元5212、第一端点续判子单元5213、第一端点续定子单元5214、第二端点判断子单元5215、第二端点确定子单元5216、第二端点续判子单元5217、第二端点续定子单元5218、节点加入单元550、节点删除单元551、路由更新单元552、以及数据反馈单元560在图6中以虚线绘制,以表示这些单元或子单元不是本申请实施例提供的装置的必要单元。
与上述分布式缓存范围查询方法相对应的,本申请实施例还提供了一种分布式缓存范围查询***。
例如,参见图7,为本申请实施例提供的分布式缓存范围查询***结构示意图。如图7所示,该***可以包括:
缓存服务器710,可以用于存储与关键字具有映射关系的缓存数据,接收查询服务器发出的针对关键字集合对应的缓存数据的查询请求,向查询服务器反馈关键字集合对应的缓存数据。
查询服务器720,可以用于将用于映射缓存数据的关键字中,可用于范围查询的字段值对应的标识值,预先存储在内存的存储区域中,且,为每个标识值分别建立对应的原始关键字集合,其中,所述原始关键字集合由包含有该标识值对应的字段值的关键字组成;响应于接收到关系范围查询请求,其中,所述关系范围查询请求携带至少两种字段值的指定范围,以及所述至少两种字段值应满足的指定关系,从所述存储区域中查找出所述至少两种字段值中至少一种字段值的指定范围的端点值对应的标识值;根据所述至少一种字段值的指定范围的端点值对应的标识值,查找出所述至少一种字段值的指定范围内的所有标识值对应的原始关键字集合;从查找出的原始关键字集合中,查找出所述至少两种字段值满足所述指定关系的关键字,得到所述关系范围查询请求对应的关键字集合,从所述缓存服务器中得到所述关键字集合对应的缓存数据,将得到的缓存数据反馈给发出所述查询请求的客户端。
客户端730,可以用于向所述查询服务器发送关系范围查询请求,接收查询服务器反馈的缓存数据。
例如,缓存服务器710可以有一个台或多台。本申请实施例所建立的可用于范围查询的不同节点环以及路由表均可以保存于该单独的查询服务器720。例如,该查询服务器720可以根据关系查询请求确定需要读取的节点环,将节点环中任一节点作为当前节点,进行后续查询步骤,在得到查询请求对应的关键字集合之后,可以通过一次多线程下载并发从所述一台或多台缓存服务器中得到所述关键字集合对应的缓存数据,将得到的缓存数据返回给发出所述关系范围查询请求的客户端。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本发明时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于***实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本发明可用于众多通用或专用的计算***环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器***、基于微处理器的***、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何***或设备的分布式计算环境等等。
本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。