数据库主键的生成方法、装置及电子设备与流程

文档序号:33639611发布日期:2023-03-29 01:41阅读:41来源:国知局
数据库主键的生成方法、装置及电子设备与流程

1.本发明涉及计算机技术领域,具体而言,涉及一种数据库主键的生成方法、装置及电子设备。


背景技术:

2.随着计算机技术的高速发展,人们的工作生活越来越离不开互联网,业务系统为了能满足商业需要,通过分布式部署实现高可用性,提高系统的吞吐量。在业务系统中,往往通过唯一的主键来标识数据库中的一笔数据。目前,相关技术在生成数据库主键时通常采用雪花算法,由于雪花算法规定的容器标识所占的位数是固定的,导致数据库主键区间利用率低。
3.针对上述的问题,目前尚未提出有效的解决方案。


技术实现要素:

4.本发明实施例提供了一种数据库主键的生成方法、装置及电子设备,以至少解决现有技术中在生成数据库主键过程中由于容器标识所占位数固定导致数据库主键区间利用率低的技术问题。
5.根据本发明实施例的一个方面,提供了一种数据库主键的生成方法,包括:获取目标时间戳和容器的数量,其中,目标时间戳为生成数据库主键时所对应的时间戳,容器用于执行数据库主键的生成命令;基于容器的数量,确定生成数据库主键的步长值,其中,数据库主键用于标识数据库中的数据,步长值表征生成数据库主键的步进数值;基于步长值确定自增数的自增值,其中,自增数为容器中以自增值进行步进增长的数字;根据目标时间戳和自增数,生成数据库主键。
6.进一步地,数据库主键的生成方法还包括:按照预设顺序,对目标时间戳和自增数所对应的二进制位数进行组合,得到数据库主键,其中,预设顺序为将二进制位数从低位到高位排列的顺序。
7.进一步地,数据库主键的生成方法还包括:基于预设的定义方式定义时间戳的数据格式;获取当前时间,并基于数据格式对当前时间进行格式转换,得到目标时间戳。
8.进一步地,数据库主键的生成方法还包括:读取容器的配置文件,获取容器的身份信息;基于身份信息,确定容器的数量。
9.进一步地,数据库主键的生成方法还包括:在容器的配置文件读取失败的情况下,获取异常数据信息,并生成异常日志,其中,所示异常日志用于提示目标对象对配置文件进行检查。
10.进一步地,数据库主键的生成方法还包括:基于自增值,对自增数进行更新,并将更新后的自增数作为当前自增数。
11.进一步地,数据库主键的生成方法还包括:基于数据库主键,对数据库中的数据进行查询,得到目标数据。
12.根据本发明实施例的另一方面,还提供了一种数据库主键的生成装置,包括:获取模块,用于获取目标时间戳和容器的数量,其中,目标时间戳为生成数据库主键时所对应的时间戳,容器用于执行数据库主键的生成命令;第一确定模块,用于基于容器的数量,确定生成数据库主键的步长值,其中,数据库主键用于标识数据库中的数据,步长值表征生成数据库主键的步进数值;第二确定模块,用于基于步长值确定自增数的自增值,其中,自增数为容器中以自增值进行步进增长的数字;生成模块,用于根据目标时间戳和自增数,生成数据库主键。
13.根据本发明实施例的另一方面,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,计算机程序被设置为运行时执行上述的数据库主键的生成方法。
14.根据本发明实施例的另一方面,还提供了一种电子设备,该电子设备包括一个或多个处理器;存储器,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器执行时,使得一个或多个处理器实现用于运行程序,其中,程序被设置为运行时执行上述的数据库主键的生成方法。
15.在本发明实施例中,采用通过自增数步进生成数据库主键的方式,首先获取目标时间戳和容器的数量,然后基于容器的数量,确定生成数据库主键的步长值,然后基于步长值确定自增数的自增值,最后根据目标时间戳和自增数,生成数据库主键。其中,目标时间戳为生成数据库主键时所对应的时间戳,容器用于执行数据库主键的生成命令,数据库主键用于标识数据库中的数据,步长值表征生成数据库主键的步进数值,自增数为容器中以自增值进行步进增长的数字。
16.在上述过程中,通过获取目标时间戳和容器的数量,为后续生成数据库主键提供了准确的数据基础。在获取到容器的数量之后,可以根据容器的数量,确定生成数据库主键的步长值,然后通过步长值,可以确定自增数的自增值,优化了容器标识的占位,大大提升了容器生成数据库主键的吞吐量。最后,根据目标时间戳和自增数,生成数据库主键,提升了主键区间利用率,提高了单位时间内生成数据库主键的数量,从而提高了数据库主键的生成效率。
17.由此可见,通过本发明的技术方案,达到了提升单位时间内数据库主键的生成数量的目的,从而实现了提升主键区间利用率、提高单位时间内的吞吐量的技术效果,进而解决了现有技术中在生成数据库主键过程中由于容器标识所占位数固定导致数据库主键区间利用率低的技术问题。
附图说明
18.此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
19.图1是根据本发明实施例的一种可选的数据库主键的生成方法的流程图;
20.图2是根据本发明实施例的一种可选的数据库主键的生成系统的示意图;
21.图3是根据本发明实施例的一种可选的数据库主键的生成装置的示意图;
22.图4是根据本发明实施例的一种可选的电子设备的示意图。
具体实施方式
23.为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
24.需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
25.需要说明的是,本发明所涉及的相关信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于展示的数据、分析的数据等),均为经用户授权或者经过各方充分授权的信息和数据。例如,本系统和相关用户或机构间设置有接口,在获取相关信息之前,需要通过接口向前述的用户或机构发送获取请求,并在接收到前述的用户或机构反馈的同意信息后,获取相关信息。
26.实施例1
27.根据本发明实施例,提供了一种数据库主键的生成方法的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
28.图1是根据本发明实施例的一种可选的数据库主键的生成方法的流程图,如图1所示,该方法包括如下步骤:
29.步骤s101,获取目标时间戳和容器的数量,其中,目标时间戳为生成数据库主键时所对应的时间戳,容器用于执行数据库主键的生成命令。
30.步骤s102,基于容器的数量,确定生成数据库主键的步长值,其中,数据库主键用于标识数据库中的数据,步长值表征生成数据库主键的步进数值。
31.步骤s103,基于步长值确定自增数的自增值,其中,自增数为容器中以自增值进行步进增长的数字。
32.步骤s104,根据目标时间戳和自增数,生成数据库主键。
33.可选的,在上述步骤中,时间戳可以是服务器本地时间,格式为年月日时分秒毫秒。容器可以是用来生成数据库主键的机器,每个容器有固定的身份标识即容器id,可选的,可以根据分布式系统中容器的个数来设定容器id。自增数是指同一时间戳、同一容器id内步进增长的数字。
34.可选的,现有技术在生成数据库主键时,主要采用以下方式:使用单独数据库的自增序列生成主键、使用通用标识码uuid(universally unique identifier)、使用雪花算法生成唯一主键。其中,在使用单独数据库的自增序列生成主键时,由于每次生成主键都需走
两次网络通道,分别是请求主键时走一次网络通道,返回主键时又走一次网络通道,存在网络消耗和时间延迟的问题,导致生成主键的效率较低。另外,这种方法对生成主键的数据库存在高度依赖,若该数据库存在故障,则整个业务系统无法正常工作,存在高可用性较低的问题。而且,由于单台数据库的最大连接数有限,当存在很大的并发请求时需要等待空闲连接,最大并发数受数据库最大连接数的限制。其中,在使用通用标识码uuid(universally unique identifier)时,生成的数据库主键不是有序的,由于大部分业务要求主键随自然时间单调递增,因此该方法不能满足业务需求。
35.具体的,雪花算法是由64位bit(比特位)构成,由时间戳、机器号和自增数组成,包括:1位固定标识位,通常取值为0;41位时间戳部分,用来表示毫秒级的时间;10位工作机器id,包括5位机器id和5位服务id,最多可以部署1024台机器;12位序列号,支持同一台机器同一毫秒时间戳下,可以生成4096个不重复的主键。但是,该方法生成数据库主键时,存在主键区间利用率比较低的问题。
36.具体的,机器可以是指分布式系统中的容器,以数据库主键由20位十进制数字(分别是17位时间戳、2位机器号和1位自增数)构成为例,根据雪花算法的生产规则,机器号固定由两位十进制的数字构成,可以表示的机器号区间是00-99,即最多可以表示100个容器。假设分布式系统里面真实存在n个容器(n的取值大于等于1,小于等于100),那么在相同的时间戳下面最多可以表示的主键个数为n*10(其中10为最大自增个数),主键区间利用率通过如下公式计算:
[0037][0038]
其中,100是两位机器号可以表示的最大容器数量。当n为1时,主键区间利用率为百分之一;当n为10时,主键区间利用率为百分之十;只有当n为最大容器数量100时,主键区间利用率才为百分之百。
[0039]
需要说明的是,本发明优化了雪花算法,极大地扩展了单位时间内生成唯一主键的区间,同时也克服了现有技术中使用单独数据库的自增序列生成主键和使用通用标识码uuid生成主键时,存在的主键可用性较低、生成主键的效率较低以及生成的主键无序等缺点。
[0040]
具体的,继续以数据库主键由20位十进制数字(分别是17位时间戳、2位机器号和1位自增数)构成为例,说明本发明的方法对雪花算法的优化。假设分布式系统里有n个容器(n的取值大于等于1,小于等于100),每个容器都有一个初始化的机器号值,然后容器通过每次步进n的方式生产唯一主键,即步长值等于容器的个数。例如,当n为10时,在每个时间戳内,每个容器分别给一个初始值000,001,002......008,009。然后在同一时间戳内,下一次生产主键时在前一次主键的基础上步进10,最多可以生成1000个数据库主键,主键区间利用率为百分之百。
[0041]
具体的,本发明优化了机器号的占位,即通过不固定位数的自增数,采用步进方式生产唯一主键。以生成一个23位数的数据库主键为例,本发明设计的数据库主键由15位时间戳数字+8位自增数构成,其中,8位自增数用来表示不定长位容器id和不定长位的自增数。可选的,每个容器对应一个配置文件,容器在初始化启动时,会去读取相对应的配置文
件,将容器id加载到内存中。可选的,在本发明中指定步进数即步长值等于分布式系统里的容器个数。
[0042]
基于上述步骤s101至步骤s104所限定的方案,可以获知,在本发明实施例中,采用通过自增数步进生成数据库主键的方式,首先获取目标时间戳和容器的数量,然后基于容器的数量,确定生成数据库主键的步长值,然后基于步长值确定自增数的自增值,最后根据目标时间戳和自增数,生成数据库主键。其中,目标时间戳为生成数据库主键时所对应的时间戳,容器用于执行数据库主键的生成命令,数据库主键用于标识数据库中的数据,步长值表征生成数据库主键的步进数值,自增数为容器中以自增值进行步进增长的数字。
[0043]
容易注意到的是,在上述过程中,通过获取目标时间戳和容器的数量,为后续生成数据库主键提供了准确的数据基础。在获取到容器的数量之后,可以根据容器的数量,确定生成数据库主键的步长值,然后通过步长值,可以确定自增数的自增值,优化了容器标识的占位,大大提升了容器生成数据库主键的吞吐量。最后,根据目标时间戳和自增数,生成数据库主键,提升了主键区间利用率,提高了单位时间内生成数据库主键的数量,从而提高了数据库主键的生成效率。
[0044]
由此可见,通过本发明的技术方案,达到了提升单位时间内数据库主键的生成数量的目的,从而实现了提升主键区间利用率、提高单位时间内的吞吐量的技术效果,进而解决了现有技术中在生成数据库主键过程中由于容器标识所占位数固定导致数据库主键区间利用率低的技术问题。
[0045]
在一种可选的实施例中,在根据目标时间戳和自增数,生成数据库主键的过程中,按照预设顺序,对目标时间戳和自增数所对应的二进制位数进行组合,得到数据库主键,其中,预设顺序为将二进制位数从低位到高位排列的顺序。
[0046]
可选的,从低位到高位排列的顺序可以是指从左至右的顺序,在得到目标时间戳和自增数之后,对目标时间戳和自增数从左至右进行排列,可以得到数据库主键。
[0047]
可选的,图2是一种可选的数据库主键的生成系统的示意图,如图2所示,包括:读取配置文件模块,获取自增数模块,获取时间戳模块,主键生成模块。具体的,在主键生成模块中,可以通过程序脚本定义获取主键的方法,并通过该方法定义返回的主键id的形式为:主键id=当前时间戳+自增数。可选的,程序脚本如下:
[0048]
public static string generateid(){//定义获取主键的方法
[0049]
return getdate()+getincrease();}//返回主键id=当前时间戳+自增数
[0050]
在一种可选的实施例中,在获取目标时间戳和容器的数量之前,首先基于预设的定义方式定义时间戳的数据格式,然后获取当前时间,并基于数据格式对当前时间进行格式转换,得到目标时间戳。可选的,在获取时间戳模块中,可以通过程序脚本定义时间戳的数据格式,然后将获取到的当前时间转换为满足需求的格式,并返回当前时间戳字符串,得到目标时间戳。可选的,程序脚本如下:
[0051]
private static string dateformat="yymmddhhmmsssss";//定义时间戳格式,格式为年月日时分秒毫秒
[0052]
public static string getdate(){//定义获取时间戳方法
[0053]
date now=new date();//定义当前时间对象
[0054]
simpledateformat sdf=new simpledateformat(dateformat);//定义日期时间
格式对象
[0055]
string datestring=sdf.format(now);//格式化当前时间,转为年月日时分秒毫秒格式
[0056]
return datestring;}//返回当前时间戳字符串
[0057]
在一种可选的实施例中,在获取目标时间戳和容器的数量之前,读取容器的配置文件,获取容器的身份信息,然后基于身份信息,确定容器的数量。可选的,在读取配置文件模块中,可以通过程序脚本定义获取容器id的方法。可选的,身份信息可以是容器的id,由于容器id与容器是一一对应的关系,因此通过容器id,可以得知分布式系统中的容器的数量。
[0058]
其中,在一种可选的实施例中,在容器的配置文件读取失败的情况下,获取异常数据信息,并生成异常日志,其中,所示异常日志用于提示目标对象对配置文件进行检查。可选的,在程序脚本的执行遇到异常的时候,会打印异常日志,记录出现的异常情况。可选的,程序脚本如下:
[0059]
public static string container_id=null;//定义容器身份id变量
[0060]
public static final integer step_by=null;//定义步长值
[0061]
properties properties=new properties();{//定义读取配置文件的方法,创建属性对象
[0062]
file file=new file("env.properties");//创建配置文件对象
[0063]
properties.load(new filereader(file));//加载配置文件的属性到属性对象中
[0064]
system.out.println(properties);//打印属性对象里面的属性到控制台日志
[0065]
container_id=properties.get(“container_id”);//从属性对象里面获取容器身份id属性
[0066]
step_by=new integer(properties.get(“container_id”));//从属性对象里面获取步长属性
[0067]
system.out.println("加载配置文件env.properties报错");//假如遇到程序异常,打印异常日志到控制台
[0068]
return properties;}//返回属性对象
[0069]
在一种可选的实施例中,在基于步长值确定自增数的自增值之后,基于自增值,对自增数进行更新,并将更新后的自增数作为当前自增数。可选的,在获取自增数模块中,可以通过程序脚本定义获取自增数的方法,并在该方法中设置自增数的更新方法为:下次自增数=当前自增数+步长值。可选的,程序脚本如下:
[0070]
private static biginteger current=new biginteger(container_id);//创建大整形对象,封装容器身份id属性
[0071]
public static synchronized string getincrease(){//定义获取自增数的方法
[0072]
current=current.add(new biginteger(step_by.tostring()));//更新自增数,下次自增数=当前自增数+步长值
[0073]
return current;}//返回自增数
[0074]
在一种可选的实施例中,在根据目标时间戳和自增数,生成数据库主键之后,基于数据库主键,对数据库中的数据进行查询,得到目标数据。可选的,在需要查询数据库中的某个数据时,可以通过数据库主键,快速获取到该数据。
[0075]
由此可见,通过本发明的技术方案,达到了提升单位时间内数据库主键的生成数量的目的,从而实现了提升主键区间利用率、提高单位时间内的吞吐量的技术效果,进而解决了现有技术中在生成数据库主键过程中由于容器标识所占位数固定导致数据库主键区间利用率低的技术问题。
[0076]
实施例2
[0077]
根据本发明实施例,提供了一种数据库主键的生成装置的实施例,其中,图3是根据本发明实施例的一种可选的数据库主键的生成装置的示意图,如图3所示,该装置包括:获取模块301,用于获取目标时间戳和容器的数量,其中,目标时间戳为生成数据库主键时所对应的时间戳,容器用于执行数据库主键的生成命令;第一确定模块302,用于基于容器的数量,确定生成数据库主键的步长值,其中,数据库主键用于标识数据库中的数据,步长值表征生成数据库主键的步进数值;第二确定模块303,用于基于步长值确定自增数的自增值,其中,自增数为容器中以自增值进行步进增长的数字;生成模块304,用于根据目标时间戳和自增数,生成数据库主键。
[0078]
需要说明的是,上述获取模块301、第一确定模块302、第二确定模块303以及生成模块304对应于上述实施例中的步骤s101至步骤s104,四个模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。
[0079]
可选的,生成模块包括:组合模块,用于按照预设顺序,对目标时间戳和自增数所对应的二进制位数进行组合,得到数据库主键,其中,预设顺序为将二进制位数从低位到高位排列的顺序。
[0080]
可选的,数据库主键的生成装置还包括:定义模块,用于基于预设的定义方式定义时间戳的数据格式;转换模块,用于获取当前时间,并基于数据格式对当前时间进行格式转换,得到目标时间戳。
[0081]
可选的,数据库主键的生成装置还包括:读取模块,用于读取容器的配置文件,获取容器的身份信息;第三确定模块,用于基于身份信息,确定容器的数量。
[0082]
可选的,数据库主键的生成装置还包括:提示模块,用于在容器的配置文件读取失败的情况下,获取异常数据信息,并生成异常日志,其中,所示异常日志用于提示目标对象对配置文件进行检查。
[0083]
可选的,数据库主键的生成装置还包括:更新模块,用于基于自增值,对自增数进行更新,并将更新后的自增数作为当前自增数。
[0084]
可选的,数据库主键的生成装置还包括:查询模块,用于基于数据库主键,对数据库中的数据进行查询,得到目标数据。
[0085]
实施例3
[0086]
根据本发明实施例的另一方面,还提供了一种计算机可读存储介质,计算机可读存储介质中存储有计算机程序,其中,计算机程序被设置为运行时执行上述的数据库主键的生成方法。
[0087]
实施例4
[0088]
根据本发明实施例的另一方面,还提供了一种电子设备,其中,图4是根据本发明实施例的一种可选的电子设备的示意图,如图4所示,电子设备包括一个或多个处理器;存储器,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器执行时,使得一个或多个处理器实现用于运行程序,其中,程序被设置为运行时执行上述的数据库主键的生成方法。处理器执行程序时实现以下步骤:获取目标时间戳和容器的数量,其中,目标时间戳为生成数据库主键时所对应的时间戳,容器用于执行数据库主键的生成命令;基于容器的数量,确定生成数据库主键的步长值,其中,数据库主键用于标识数据库中的数据,步长值表征生成数据库主键的步进数值;基于步长值确定自增数的自增值,其中,自增数为容器中以自增值进行步进增长的数字;根据目标时间戳和自增数,生成数据库主键。
[0089]
可选的,处理器执行程序时还实现以下步骤:按照预设顺序,对目标时间戳和自增数所对应的二进制位数进行组合,得到数据库主键,其中,预设顺序为将二进制位数从低位到高位排列的顺序。
[0090]
可选的,处理器执行程序时还实现以下步骤:在获取目标时间戳和容器的数量之前,基于预设的定义方式定义时间戳的数据格式;获取当前时间,并基于数据格式对当前时间进行格式转换,得到目标时间戳。
[0091]
可选的,处理器执行程序时还实现以下步骤:在获取目标时间戳和容器的数量之前,读取容器的配置文件,获取容器的身份信息;基于身份信息,确定容器的数量。
[0092]
可选的,处理器执行程序时还实现以下步骤:在容器的配置文件读取失败的情况下,获取异常数据信息,并生成异常日志,其中,所示异常日志用于提示目标对象对配置文件进行检查。
[0093]
可选的,处理器执行程序时还实现以下步骤:在基于步长值确定自增数的自增值之后,基于自增值,对自增数进行更新,并将更新后的自增数作为当前自增数。
[0094]
可选的,处理器执行程序时还实现以下步骤:在根据目标时间戳和自增数,生成数据库主键之后,基于数据库主键,对数据库中的数据进行查询,得到目标数据。
[0095]
本文中的设备可以是服务器、pc、pad、手机等。
[0096]
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0097]
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
[0098]
在本技术所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
[0099]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0100]
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单
元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0101]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0102]
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1