一种哈希分区管理方法及装置制造方法

文档序号:6506031阅读:178来源:国知局
一种哈希分区管理方法及装置制造方法
【专利摘要】本申请提供一种哈希分区管理方法及装置,包括确定键值(Key)中包含有范围关键信息;对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。本申请利用key的用于区分不同的范围的Key前缀部分进行哈希运算来分区,保证了具有相同Key前缀的Key分布在了同一数据节点上,使得Key在各数据节点上的分布具有了针对性,从而提高了哈希分区的管理效率。进一步地,基于本申请的哈希分区方法的范围查询确保了需要查找的范围内的key存储在同一数据节点上,大大缩短了响应时间,而且范围查询不需要在每个数据节点上执行,大大减轻了分布式存储系统的负载。
【专利说明】一种哈希分区管理方法及装置

【技术领域】
[0001]本申请涉及分布式存储技术,尤指一种哈希分区管理方法及装置。

【背景技术】
[0002]哈希分区(hash partit1n)是哈希(hash)在数据库中一个简单的应用,哈希分区的原理就是,利用hash函数对某个键值(key)进行hash运算,然后根据hash值确定哈希分区将其分布到分布式存储系统中不同的数据节点上。现有哈希分区的方法对Key在各数据节点上的分布随意,确保了数据在预先确定数目的分区中的平均分布。


【发明内容】

[0003]为了解决上述技术问题,本申请提供了一种哈希分区管理方法及装置,能够保证Key在各数据节点上的分布具有针对性,从而提高哈希分区的管理效率。
[0004]为了达到本申请目的,本申请提供一种哈希分区管理方法,包括:确定键值Key中包含有范围关键信息;
[0005]对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。
[0006]所述Key包括Key ill缀和Key后缀;其中,
[0007]所述范围关键信息为key前缀,用于区分不同的范围;
[0008]Key后缀是不同的Key的值。
[0009]所述key的数据结构包括:
[0010]用于表明所述Key的长度的Key的总长度字段;
[0011]用于表明所述Key前缀的长度的Key前缀长度字段;以及,
[0012]用于携带Key的值的Key值字段。
[0013]所述确定Key中包含有范围关键信息包括:判断所述Key的Key前缀长度字段的取值是否大于0,如果大于0,则确定所述Key中包含有范围关键信息。
[0014]该方法还包括:如果所述Key的Key前缀长度字段的取值不大于0,则确定所述Key中未包含范围关键信息。
[0015]所述对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区包括:
[0016]对所述key的key前缀进行哈希hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;
[0017]根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将所述Key的Key后缀写入找到的数据节点。
[0018]该方法还包括:对整个所述key进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;
[0019]根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将该Key的值写入找到的数据节点。
[0020]当进行范围查找时,该方法还包括:
[0021]判断所述范围查找的范围下限Key和范围上限Key中是否均包含有Key前缀:判断范围下限Key中包含的Key前缀,与范围上限Key中包含的Key前缀是否一致,如果判断出范围下限Key和范围上限Key中均包含有Key前缀且二者一致,则,
[0022]对所述Key前缀进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区,再根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点。
[0023]所述范围下限Key和范围上限Key中是否均包含有Key前缀包括:
[0024]如果所述范围下限Key和范围上限Key的Key前缀长度字段的取值均大于0,则确定范围下限Key和范围上限Key中均包含有Key前缀。
[0025]如果判断出所述范围下限Key和范围上限Key中有一个或者两个都不包含Key前缀,或者都包含但是二者不一致,该方法还包括:
[0026]返回查询失败,或者按照现有的范围查询方法进行查询。
[0027]本申请还提供一种哈希分区管理装置,包括判断模块,及分区模块;其中,判断模块,用于确定Key中包含有范围关键信息,向分区模块发送第一通知;
[0028]分区模块,用于接到第一通知,对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。
[0029]所述判断模块,具体用于判断所述Key的Key前缀长度字段的取值是否大于0,如果大于0,则确定所述Key中包含有范围关键信息,向分区模块发送第一通知;
[0030]所述分区模块,具体用于接收来自判断模块的第一通知,对所述key的key前缀进行哈希hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将所述Key的Key后缀写入找到的数据节点。
[0031]所述判断模块,还用于在判断出所述Key的Key前缀长度字段的取值不大于0,则确定所述Key中未包含范围关键信息,向分区模块发送第二通知;
[0032]所述分区模块,还用于接收到来自判断模块的第二通知,对整个所述key进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将该Key的值写入找到的数据节点。
[0033]还包括确定模块,此时,
[0034]所述判断模块,还用于判断范围查找的范围下限Key和范围上限Key中是否均包含有Key前缀:判断范围下限Key中包含的Key前缀,与范围上限Key中包含的Key前缀是否一致,如果判断出范围下限Key和范围上限Key中均包含有Key前缀且二者一致,向确定模块发送第三通知;
[0035]确定模块,用于接收来自判断模块的第三通知,对所述Key前缀进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区,再根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点。
[0036]所述判断模块,还用于在判断出所述范围下限Key和范围上限Key中有一个或者两个都不包含Key前缀,或者都包含但是二者不一致时,向确定模块发送第四通知;
[0037]所述确定模块,还用于接收来自判断模块的第四通知,返回查询失败,或者按照现有的范围查询方法进行查询。
[0038]本申请提供的方案包括确定Key中包含有范围关键信息;对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。本申请提供的技术方案,利用key的用于区分不同的范围的Key前缀部分进行哈希运算来分区,这样,保证了具有相同Key前缀的Key分布在了同一数据节点上,使得Key在各数据节点上的分布具有了针对性,从而提高了哈希分区的管理效率。
[0039]进一步地,基于本申请的哈希分区方法,在进行哈希分区管理如范围查询中,范围下限Key和范围上限Key中均包含有Key前缀且二者一致,利用该Key前缀部分进行查找到的数据节点必然是同一个数据节点。可见,由于通过本申请方案确保了需要查找的范围内的key存储在同一数据节点上,不需要查找的范围内的key存储在哪个数据节点上,也不需要在每个数据节点上进行查找后再合并查找结果,大大缩短了响应时间,而且范围查询不需要在每个数据节点上执行,大大减轻了分布式存储系统的负载。
[0040]本申请的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请而了解。本申请的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

【专利附图】

【附图说明】
[0041]附图用来提供对本申请技术方案的进一步理解,并且构成说明书的一部分,与本申请的实施例一起用于解释本申请的技术方案,并不构成对本申请技术方案的限制。
[0042]图1为本申请哈希分区管理方法的流程示意图;
[0043]图2为本申请哈希分区管理装置的组成结构示意图。

【具体实施方式】
[0044]为使本申请的目的、技术方案和优点更加清楚明白,下文中将结合附图对本申请的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
[0045]在本申请一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
[0046]内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
[0047]计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPR0M)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0048]在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0049]基于采用现有哈希分区方法的分布式存储系统中,由于Key在各数据节点上的分布随意,因此,在进行范围查找时,该范围查找需要在分布式存储系统中的每个数据节点上执行,然后再合并(merge)执行结果后得到范围查找结果。举例来讲,假设查询key的范围是aaab?aaaz (按字符串排序)。对于哈希分区的分布式存储系统,key为aaaba值可能存储在节点I上,key为aaabb值可能存储在节点2上,key为aaayyyy值可能存储在节点η上。而这整个范围区间内可能有任意多个key,且这些key肯定是散落在各个数据节点上的。那么,在进行范围查找时,需要将该范围查询下发至分布式系统中的每一个数据节点上,在每个数据节点上执行后,再合并每个数据节点返回执行结果。
[0050]可见,基于现有哈希分区方法的分布式存储系统,Key在各数据节点上的分布太过随意,不便于哈希分区的管理,甚至降低哈希分区的管理效率。比如,在进行范围查询时,一方面,由于无法确定需要查找的范围内的key存储在哪个数据节点上,需要在每个数据节点上进行查找后再合并查找结果,因此,增长了单次查询响应时间,而且随着整个分布式存储系统规模越来越大,响应时间将会越来越长;另一方面,由于每次范围查询都需要在每个数据节点上执行,必然增加了这个分布式存储系统的负载。
[0051]图1为本申请哈希分区管理方法的流程示意图,如图1所示,包括:
[0052]步骤100:确定Key中包含有范围关键信息。
[0053]本步骤中,针对某些Key,预先设置其格式由Key前缀(prefixkey)和Key后缀(suffixkey)两部分组成;其中,key前缀为范围关键信息,用于区分不同的范围。比如,在范围查询中,范围中的各个key的Key前缀是相同的。Key后缀是不同的Key的值。其中,哪些key需要按照包括Key前缀和Key后缀的格式来设置,是由上层业务决定的,也就是说,上层业务需要对key作范围查找,则将该Key设置包括Key前缀和Key后缀的格式。
[0054]在分布式存储系统中,由Key前缀和Key后缀两部分组成的key的数据结构主要包括用于表明Key的长度的Key总长度(totalsize)字段、用于表明Key前缀的长度的Key前缀长度(prefixsize)字段,以及用于携带Key的值的Key值(data)字段。其中,如果prefixsize字段的取值等于O,则表明该Key为现有技术中定义的Key值。
[0055]本步骤中,确定Key中包含有范围关键信息包括:判断Key的prefixsize字段的取值是否大于0,如果大于0,则确定Key中包含有范围关键信息。
[0056]进一步地,如果Key的prefixsize字段的取值不大于O,则确定Key中未包含范围关键信息,此时的Key为现有技术中定义的Key值。
[0057]步骤101:对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。
[0058]对key的prefixkey部分进行hash运算,并将得到的hash值对系统中最大的分区(maxpartit1n)值进行取模运算,得到该key落入的分区;最后,根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将该Key的Key后缀的值写入找到的数据节点。其中的hash运算、取模运算、查找数据节点的具体实现方法属于本领域技术人员的公知技术,并不属于本申请的保护范围。这里强调的是,对于某些Key,在进行哈希分区时,是利用key的prefixkey部分进行哈希运算来分区的,这样,保证了具有相同Key前缀的Key分布在了同一数据节点上,使得Key在各数据节点上的分布具有了针对性,从而提高了哈希分区的管理效率。
[0059]如果确定出Key中未包含范围关键信息,本申请方法还进一步包括,按照现有哈希分区方法,对整个key进行hash运算,并将得到的hash值对系统中最大的分区(maxpartit1n)值进行取模运算,得到该key落入的分区;最后,根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将该Key值写入找到的数据节点。
[0060]基于本申请的哈希分区方法,假设范围查找的范围下限Key为(startkey),范围上限Key (endkey),作为哈希分区的管理中范围查找的具体实现包括:
[0061]首先,判断范围下限Key和范围上限Key中是否均包含有Key前缀:如果范围下限Key和范围上限Key的prefixsize字段的取值均大于O,则确定范围下限Key和范围上限Key中均包含有Key前缀;接着,判断范围下限Key中包含的Key前缀,与范围上限Key中包含的Key前缀是否一致,如果二者相同则一致。
[0062]在判断出范围下限Key和范围上限Key中均包含有Key前缀且二者一致时,对该Key前缀部分进行hash运算,并将得到的hash值对系统中最大的分区(maxpartit1n)值进行取模运算,得到该key落入的分区,再根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,从而实现范围查找。可见,基于本申请的哈希分区方法,本申请的范围查找方法中,需要查找的范围内的key存储在同一数据节点上,大大缩短了响应时间,范围查询不需要在每个数据节点上执行,大大减轻了分布式存储系统的负载。
[0063]下面举具体实施例进行说明。上层业务在使用时,在写入Key和范围查询时指定Key前缀(prefixkey)。以某即时通信系统的最近联系人业务为例,假设写入Key时,将当前用户标识(userid)作为prefixkey,以联系的当前时间(timestamp)作为Key后缀(suffixkey),而根据该写入的Key查找到的有效值(value)贝U是联系的对方userid。按照本申请图1所示的方法,由于当前用户标识(userid)作为prefixkey —致,利用其进行哈希分区后,这些Key必然被写入同一数据节点上。
[0064]在进行范围查找时,将当前userid作为prefixkey,范围可以是某个时间区间。比如:userid为10000000,查找当前时间(now) 10天内的最近联系人,贝U查询区间Key为(lOOOOOOOnow?10000000 (now-10)),该范围内的所有key都会落入在一个数据节点上执行完成,同样,对于作为范围上限Key和范围下限Key的prefixkey均为当前用户标识(userid),利用其进行哈希分区查找后,必然在同一数据节点上查找到这个范围的所有Key。
[0065]进一步地,如果判断出范围下限Key和范围上限Key中有一个或者两个都不包含Key前缀,或者即使都包含但是二者不一致,那么,可以返回查询失败,也可以按照现有的范围查询方法进行查询。
[0066]图2为本申请哈希分区管理装置的组成结构示意图,本发明哈希分区管理装置可以设置在分布式系统的配置中心,如图2所示,包括判断模块,及分区模块,其中,
[0067]判断模块,用于确定Key中包含有范围关键信息,向分区模块发送第一通知。具体用于:判断Key的Key前缀长度字段的取值是否大于0,如果大于0,则确定所述Key中包含有范围关键信息,向分区模块发送第一通知。
[0068]判断模块,还用于在判断出Key的Key前缀长度字段的取值不大于0,则确定所述Key中未包含范围关键信息,向分区模块发送第二通知。
[0069]分区模块,用于接到第一通知,对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。具体用于:接收来自判断模块的第一通知,对key的key前缀进行哈希hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将所述Key的Key后缀写入找到的数据节点。
[0070]分区模块,还用于接收到来自判断模块的第二通知,对整个所述key进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将该Key的值写入找到的数据节点。
[0071]本申请哈希分区管理装置还包括确定模块,此时,
[0072]判断模块,还用于判断范围查找的范围下限Key和范围上限Key中是否均包含有Key前缀:判断范围下限Key中包含的Key前缀,与范围上限Key中包含的Key前缀是否一致,如果判断出范围下限Key和范围上限Key中均包含有Key前缀且二者一致,向确定模块发送第三通知。
[0073]判断模块还用于,在判断出所述范围下限Key和范围上限Key中有一个或者两个都不包含Key前缀,或者都包含但是二者不一致时,向确定模块发送第四通知。
[0074]确定模块,用于接收来自判断模块的第三通知,对所述Key前缀进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区,再根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点。
[0075]确定模块还用于,接收来自判断模块的第四通知,返回查询失败,或者按照现有的范围查询方法进行查询。
[0076]本领域的技术人员应该明白,上述的本申请实施例所提供的装置的各组成部分,以及方法中的各步骤,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上。可选地,它们可以用计算装置可执行的程序代码来实现。从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
[0077]虽然本申请所揭露的实施方式如上,但所述的内容仅为便于理解本申请而采用的实施方式,并非用以限定本申请。任何本申请所属领域内的技术人员,在不脱离本申请所揭露的精神和范围的前提下,可以在实施的形式及细节上进行任何的修改与变化,但本申请的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
【权利要求】
1.一种哈希分区管理方法,其特征在于,包括:确定键值Key中包含有范围关键信息; 对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。
2.根据权利要求1所述的哈希分区管理方法,其特征在于,所述Key包括Key前缀和Key后缀;其中, 所述范围关键信息为key前缀,用于区分不同的范围; Key后缀是不同的Key的值。
3.根据权利要求2所述的哈希分区管理方法,其特征在于,所述key的数据结构包括: 用于表明所述Key的长度的Key的总长度字段; 用于表明所述Key前缀的长度的Key前缀长度字段;以及, 用于携带Key的值的Key值字段。
4.根据权利要求3所述的哈希分区管理方法,其特征在于,所述确定Key中包含有范围关键信息包括:判断所述Key的Key前缀长度字段的取值是否大于O,如果大于O,则确定所述Key中包含有范围关键信息。
5.根据权利要求4所述的哈希分区管理方法,其特征在于,该方法还包括:如果所述Key的Key前缀长度字段的取值不大于O,则确定所述Key中未包含范围关键信息。
6.根据权利要求4所述的哈希分区管理方法,其特征在于,所述对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区包括: 对所述key的key前缀进行哈希hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区; 根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将所述Key的Key后缀写入找到的数据节点。
7.根据权利要求5所述的哈希分区管理方法,其特征在于,该方法还包括:对整个所述key进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区; 根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将该Key的值写入找到的数据节点。
8.根据权利要求4或6所述的哈希分区管理方法,其特征在于,当进行范围查找时,该方法还包括: 判断所述范围查找的范围下限Key和范围上限Key中是否均包含有Key前缀:判断范围下限Key中包含的Key前缀,与范围上限Key中包含的Key前缀是否一致,如果判断出范围下限Key和范围上限Key中均包含有Key前缀且二者一致,则, 对所述Key前缀进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区,再根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点。
9.根据权利要求8所述的哈希分区管理方法,其特征在于,所述范围下限Key和范围上限Key中是否均包含有Key前缀包括: 如果所述范围下限Key和范围上限Key的Key前缀长度字段的取值均大于O,则确定范围下限Key和范围上限Key中均包含有Key前缀。
10.根据权利要求8所述的哈希分区管理方法,其特征在于,如果判断出所述范围下限Key和范围上限Key中有一个或者两个都不包含Key前缀,或者都包含但是二者不一致,该方法还包括: 返回查询失败,或者按照现有的范围查询方法进行查询。
11.一种哈希分区管理装置,其特征在于,包括判断模块,及分区模块;其中,判断模块,用于确定Key中包含有范围关键信息,向分区模块发送第一通知; 分区模块,用于接到第一通知,对范围关键信息进行哈希运算,并根据得到的哈希值进行哈希分区。
12.根据权利要求11所述的哈希分区管理装置,其特征在于, 所述判断模块,具体用于判断所述Key的Key前缀长度字段的取值是否大于O,如果大于O,则确定所述Key中包含有范围关键信息,向分区模块发送第一通知; 所述分区模块,具体用于接收来自判断模块的第一通知,对所述key的key前缀进行哈希hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将所述Key的Key后缀写入找到的数据节点。
13.根据权利要求12所述的哈希分区管理装置,其特征在于, 所述判断模块,还用于在判断出所述Key的Key前缀长度字段的取值不大于O,则确定所述Key中未包含范围关键信息,向分区模块发送第二通知; 所述分区模块,还用于接收到来自判断模块的第二通知,对整个所述key进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区;根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点,并将该Key的值写入找到的数据节点。
14.根据权利要求11?13任一项所述的哈希分区管理装置,其特征在于,还包括确定模块,此时, 所述判断模块,还用于判断范围查找的范围下限Key和范围上限Key中是否均包含有Key前缀:判断范围下限Key中包含的Key前缀,与范围上限Key中包含的Key前缀是否一致,如果判断出范围下限Key和范围上限Key中均包含有Key前缀且二者一致,向确定模块发送第三通知; 确定模块,用于接收来自判断模块的第三通知,对所述Key前缀进行hash运算,并将得到的hash值对系统中最大的分区值进行取模运算,得到该key落入的分区,再根据系统中的分区与数据节点的对应关系找到该分区所在的数据节点。
15.根据权利要求14所述的哈希分区管理装置,其特征在于, 所述判断模块,还用于在判断出所述范围下限Key和范围上限Key中有一个或者两个都不包含Key前缀,或者都包含但是二者不一致时,向确定模块发送第四通知; 所述确定模块,还用于接收来自判断模块的第四通知,返回查询失败,或者按照现有的范围查询方法进行查询。
【文档编号】G06F17/30GK104298687SQ201310303609
【公开日】2015年1月21日 申请日期:2013年7月18日 优先权日:2013年7月18日
【发明者】朱国云, 王玉法, 赵恒 , 杨成虎, 侯凤林 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1