数据异步持久化方法、装置及计算机可读存储介质与流程

文档序号:17489376发布日期:2019-04-23 20:18阅读:312来源:国知局
数据异步持久化方法、装置及计算机可读存储介质与流程

本发明涉及通讯领域,尤其涉及一种数据异步持久化方法、装置以及计算机可读存储介质。



背景技术:

数据安全和完整性在现代企业中的显得越来越重要,持久化是保障程序数据安全和完整性的一种重要方法。数据异步持久化技术是一种高效的持久化方法,其核心是异步执行持久化过程。在使用中间件的系统中,有需要大量传输的数据,而这些数据需要持久化并保障数据的安全和完整性。

消息中间件利用高效可靠的消息传递机制进行平台无关的消息交换,是分布式环境下应用组件间通信的重要基础系统。现有的消息中间件数据异步持久化方法在本地建立磁盘文件或者数据库,当消息中间件从上游接收到消息之后,将消息放入消息队列中供数据异步持久化组件持久化。当消息中间件将消息发送到网络之后,将消息放入共享内存中,本地的数据异步持久化进程将消息写入本地磁盘文件或者数据库。当数据持久化成功,则删除共享内存中的消息,当遇到数据丢失或者需要检索持久化组件数据的时候,从本地文件或者数据库中读取数据。因此,现有的消息中间件数据异步持久化方法在遇到巨量数据需要数据异步持久化或检索时,数据存储结构不够灵活以及效率不高。

上述内容仅用于辅助理解本发明的技术方案,并不代表承认上述内容是现有技术。



技术实现要素:

本发明的主要目的在于提供一种数据异步持久化方法、装置以及计算机可读存储介质,旨在遇到巨量数据需要数据异步持久化或检索持久化数据时,数据存储结构不够灵活以及检索效率不高的问题。

为了达到上述目的,本发明提供一种数据异步持久化方法,所述数据异步持久化方法包括以下步骤:

在接收到消息中间件输入的数据消息时,获取所述数据消息并根据所述数据消息生成索引;

获取所述数据消息的主题、主题集合以及全局序列,将所述索引存放入与所述主题、所述主题集合以及所述全局序列对应的预设存储结构中;

在所述主题、所述主题集合或所述全局序列对应的任一预设存储结构存满时,持久化所述存满的预设存储结构以及所述存满的预设存储结构中的索引对应的数据消息。

优选地,所述持久化所述存满的预设存储结构以及所述存满的预设存储结构中的索引对应的数据消息的步骤包括:

获取所述存满的预设存储结构,并将所述存满的预设存储结构存入对应的索引文件;

获取所述存满的预设存储结构中的索引,并将所述索引对应的数据消息存入数据文件。

优选地,所述将所述索引对应的数据消息存入数据文件的步骤之后,还包括:

在生成索引文件后清空所述预设存储结构中的索引,并且删除缓存中的所述索引对应的所述数据消息。

优选地,所述获取所述数据信息并根据所述数据信息生成主题索引的步骤之前,还包括:

获取所述数据信息的存储大小以及共享内存的容量;

在所述数据信息的存储大小小于所述共享内存的容量时,将所述数据信息存储在所述共享内存;

在所述数据信息的存储大小大于所述共享内存的剩余容量时,将所述共享内存中的数据存入硬盘中。

优选地,所述数据异步持久化方法还包括:

在接收到所述消息中间件发送的检索请求时,获取所述检索请求对应的检索索引,其中,所述检索索引可以是主题索引、主题集合索引以及全局序列索引;

获取所述检索索引对应的数据消息;

在获取到所述检索索引对应的数据消息时,将所述数据消息发送至所述消息中间件。

优选地,所述获取所述检索索引检索对应的数据消息的步骤之后,还包括:

在未获取到所述检索索引对应的数据消息时,输出未获取到数据消息的提示信息。

优选地,所述数据异步持久化方法还包括:

在接收到恢复系统数据请求时,获取所述系统故障信息对应的故障类型;

获取所述故障类型对应的恢复程序,并根据所述恢复程序恢复所述共享内存中的数据消息。

此外,为实现上述目的,本发明还提供一种数据异步持久化装置,所述数据异步持久化装置包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的数据异步持久化程序,所述数据异步持久化程序被所述处理器执行时实现如上所述的数据异步持久化方法的步骤。

此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有数据异步持久化程序,所述数据异步持久化程序被处理器执行时实现如上所述的数据异步持久化方法的步骤。

本发明提供的数据异步持久化方法、装置以及计算机可读存储介质,首先,在接收到消息中间件输入的数据消息时,获取所述数据消息并根据所述数据消息生成索引,然后,获取所述数据消息的主题、主题集合以及全局序列,将所述索引存放入与所述主题、所述主题集合以及所述全局序列对应的预设存储结构中,最后,在所述主题、所述主题集合或所述全局序列对应的任一预设存储结构存满时,持久化所述存满的预设存储结构以及所述存满的预设存储结构中的索引对应的数据消息。因本发明能够根据消息中间件输入输出的消息生成索引,然后再根据消息的所属主题和主题集合将放入不同的索引数组,并能持久化索引数组,从而解决了遇到巨量数据需要数据异步持久化或检索持久化数据时,数据存储结构不够灵活以及检索效率不高的问题。

附图说明

附图说明用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:

图1为本发明实施例方案涉及的数据异步持久化装置的硬件结构示意图;

图2为本发明数据异步持久化方法第一实施例的流程示意图;

图3为本发明数据异步持久化方法第二实施例的流程示意图;

图4为本发明数据异步持久化方法第三实施例的流程示意图;

图5为本发明数据异步持久化方法第四实施例的流程示意图;

图6为本发明数据异步持久化方法第五实施例的流程示意图;

图7为本发明数据异步持久化方法第六实施例的流程示意图;

图8为本发明数据异步持久化方法第七实施例的流程示意图;

图9为本发明数据异步持久化方法中索引的数据结构示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明实施例的主要解决方案是:在接收到消息中间件输入的数据消息时,获取所述数据消息并根据所述数据消息生成索引;获取所述数据消息的主题、主题集合以及全局序列,将所述索引存放入与所述主题、所述主题集合以及所述全局序列对应的预设存储结构中;在所述主题、所述主题集合或所述全局序列对应的任一预设存储结构存满时,持久化所述存满的预设存储结构以及所述存满的预设存储结构中的索引对应的数据消息。

由于现有的消息中间件数据异步持久化方法在遇到巨量数据需要数据异步持久化或检索持久化数据时,数据存储结构不够灵活以及效率不高。

本发明提供一种解决方案,首先,在接收到消息中间件输入的数据消息时,获取所述数据消息并根据所述数据消息生成索引;然后,获取所述数据消息的主题、主题集合以及全局序列,将所述索引存放入与所述主题、所述主题集合以及所述全局序列对应的预设存储结构中;最后,在所述主题、所述主题集合或所述全局序列对应的任一预设存储结构存满时,持久化所述存满的预设存储结构以及所述存满的预设存储结构中的索引对应的数据消息。因本发明能够根据消息中间件输入输出的消息生成索引,然后再根据消息的所属主题和主题集合将放入不同的索引数组,并能持久化索引数组,从而解决了遇到巨量数据需要数据异步持久化或检索持久化数据时,数据存储结构不够灵活以及检索效率不高的问题。

如图1所示,图1是本发明实施例方案涉及装置的硬件结构示意图。

参照图1,该装置可以包括:处理器1001,例如cpu,存储器1002,通信总线1003,网络接口1004。其中,通信总线1003用于实现该装置中各组成部件之间的连接通信。网络接口1004可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。存储器1002可以是高速ram存储器,也可以是稳定的存储器(non-volatilememory),例如磁盘存储器。存储器1002可选的还可以是独立于前述处理器1001的存储装置。如图1所示,作为一种计算机存储介质的存储器1002中可以包括操作系统、网络通信模块以及数据异步持久化程序。

本领域技术人员可以理解,图1中示出的装置结构并不构成对装置的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

在图1所示的装置所涉及的硬件中,网络接口1004可以用于接收外部请求以及发送所述外部请求对应的数据;而处理器1001可以用于调用存储器1002中存储的数据异步持久化程序,并执行以下操作:

在接收到消息中间件输入的数据消息时,获取所述数据消息并根据所述数据消息生成索引;

获取所述数据消息的主题、主题集合以及全局序列,将所述索引存放入与所述主题、所述主题集合以及所述全局序列对应的预设存储结构中;

在所述主题、所述主题集合或所述全局序列对应的任一预设存储结构存满时,持久化所述存满的预设存储结构以及所述存满的预设存储结构中的索引对应的数据消息。

进一步地,处理器1001可以用于调用存储器1002中存储的数据异步持久化程序,还执行以下操作:

获取所述存满的预设存储结构,并将所述存满的预设存储结构存入对应的索引文件;

获取所述存满的预设存储结构中的索引,并将所述索引对应的数据消息存入数据文件。

进一步地,处理器1001可以用于调用存储器1002中存储的数据异步持久化程序,还执行以下操作:

在生成索引文件后清空所述预设存储结构中的索引,并且删除缓存中的所述索引对应的所述数据消息。

进一步地,处理器1001可以用于调用存储器1002中存储的数据异步持久化程序,还执行以下操作:

获取所述数据信息的存储大小以及共享内存的容量;

在所述数据信息的存储大小小于所述共享内存的容量时,将所述数据信息存储在所述共享内存;

在所述数据信息的存储大小大于所述共享内存的剩余容量时,将所述共享内存中的数据存入硬盘中。

进一步地,处理器1001可以用于调用存储器1002中存储的数据异步持久化程序,还执行以下操作:

在接收到所述消息中间件发送的检索请求时,获取所述检索请求对应的检索索引,其中,所述检索索引可以是主题索引、主题集合索引以及全局序列索引;

获取所述检索索引对应的数据消息;

在获取到所述检索索引对应的数据消息时,将所述数据消息发送至所述消息中间件。

进一步地,处理器1001可以用于调用存储器1002中存储的数据异步持久化程序,还执行以下操作:

在未获取到所述检索索引对应的数据消息时,输出未获取到数据消息的提示信息。

进一步地,处理器1001可以用于调用存储器1002中存储的数据异步持久化程序,还执行以下操作:

在接收到恢复系统数据请求时,获取所述系统故障信息对应的故障类型;

获取所述故障类型对应的恢复程序,并根据所述恢复程序恢复所述共享内存中的数据消息。

参照图2,图2为本发明数据异步持久化方法的第一实施例,所述数据异步持久化方法包括:

步骤s10、在接收到消息中间件输入的数据消息时,获取所述数据消息并根据所述数据消息生成索引;

步骤s20、获取所述数据消息的主题、主题集合以及全局序列,将所述索引存放入与所述主题、所述主题集合以及所述全局序列对应的预设存储结构中;

步骤s30、在所述主题、所述主题集合或所述全局序列对应的任一预设存储结构存满时,持久化所述存满的预设存储结构以及所述存满的预设存储结构中的索引对应的数据消息。

本发明提供的技术方案,所述主题、所述主题集合以及所述全局序列可以有多个,且所述主题集合包含一个或多个所述主题,所述主题可以包含一个或多个所述全局序列。所述预设存储结构可以是数组、图或链表等存储结构,本发明中的预设存储结构主要以数组进行阐述。主题对应的预设存储结构为主题索引数组,主题集合对应的预设存储结构为主题集合索引数组,全局序列对应的预设存储结构为全局序列索引数组。

本发明提供的数据异步持久化方法主要用于将消息中间件输入的消息建立灵活的存储结构进行存储,以及在系统出现故障时通过三级索引进行快速恢复数据,所述三级索引包括主题集合索引、主题索引以及全局序列索引。所述主题索引为一级索引,是一种虚拟通道,所述主题索引所代表的主题可以被多个接受者订阅;二级索引为主题集合索引,根据主题的集合来建立索引;三级索引为全局序列索引,所述全局序列索引按照消息的全局排序建立。建立了三个级别的索引后,可以将消息中间件的输入输出消息按照不同级别存储,在检索持久化数据的时候更可以灵活从不同级别的索引检索数据。

本发明提供的技术方案,在接收到消息中间件输入的数据消息时,获取所述数据消息并解码,根据所述数据消息生成索引;根据消息所属主题,将生成的索引放入确定的主题索引数组中;根据消息所属主题集合,将索引放入确定的主题集合索引数组中;最后将索引存放入全局序列索引中。在所有索引数组满的时候持久化索引数组和数据消息。在接收到消息中间件输入的数据消息时,获取所述数据消息并解码,根据所述数据消息生成索引;根据消息所属主题,将生成的索引放入确定的主题索引数组中;根据消息所属主题集合,将索引放入确定的主题集合索引数组中;最后将索引存放入全局序列索引中。

需要说明的是,将需要持久化的数据分为输入持久化数据和输出持久化数据,其中对从消息中间件输入持久化数据使用三级索引结构存储数据,对输出持久化数据使用主题索引存储数据,建立三个级别的索引之后查询数据速度大幅提高。

需要说明的是,图9为共享内存中的索引结构如下图,idxcnt字段表示索引计数器,startsqn字段表示开始序列号,每一个索引结构包含两个字段,startpos字段表示开始位置,msgsize字段表示消息大小。进一步地,所述主题索引、所述主题集合索引以及所述全局序列索引都是根据所述消息生成的。

因本发明能够根据消息中间件输入输出的消息生成索引,然后再根据消息的所属主题和主题集合将放入不同的索引数组,并能持久化索引数组,从而解决了遇到巨量数据需要数据异步持久化或检索持久化数据时,数据存储结构不够灵活以及检索效率不高的问题。

进一步的,参照图3,图3为本发明数据异步持久化方法的第二实施例,基于上述实施例,所述步骤s30,包括:

步骤s31、获取所述存满的预设存储结构,并将所述存满的预设存储结构存入对应的索引文件;

步骤s32、获取所述存满的预设存储结构中的索引,并将所述索引对应的数据消息存入数据文件。

本实施例提供的技术方案中,所述预设存储结构可以是数组、图或链表等存储结构,本发明中的预设存储结构主要以数组进行阐述。主题对于的预设存储结构为主题索引数组,主题集合对应的预设存储结构为主题集合索引数组,全局序列对应的预设存储结构为全局序列索引数组。持久化输入线程负责输入消息的持久化。本发明的异步持久化通过文件存储,输入消息通过一个共享内存消息队列传输,持久化线程启动后循环轮询该队列,从队列获取消息并通过消息解码器解码之后,先将消息存入内部共享内存,待共享内存满或者超出单个磁盘文件之后再将消息批量持久化,当索引数组满的时候再写入磁盘。

进一步地,消息中间件可能会在一段时间内接收巨量的数据消息,所述巨量的消息可以是几十万条或几百万条,在消息中间件接收到数据消息时,将所述数据消息存储在缓存中,然后根据所述数据消息生成索引,并将所述索引存储在数组中,在数组存满索引后,获取所述数组并将所述数组中的索引写入对于的索引文件中,例如,在主题索引数组存满时,获取所述主题索引数组中的所有索引并写入主题索引文件中;在主题集合索引数组存满时,获取所述主题集合索引数组中的所有索引并写入主题集合索引文件中;在全局序列索引数组存满时,获取所述全局序列索引数组中的所有索引并写入全局序列索引文件中。在数组中的索引存储到索引文件后,在缓存中获取所述索引对应的数据消息,并将所述数据消息存入数据文件。

终端将存储在数组中的索引持久化在索引文件中,从而提高了消息检索的效率。

进一步的,参照图4,图4为本发明数据异步持久化方法的第三实施例,在上述图3所示的实施例基础上,所述步骤s31之后,还包括:

步骤s33、在生成索引文件后清空所述预设存储结构中的索引,并且删除缓存中的所述索引对应的所述数据消息。

本实施例提供的技术方案中,终端在数组存满索引后,获取所述数组并将所述数组中的索引写入对于的索引文件中,在生成索引文件后清空所述预设存储结构中的索引,索引计数器清零,并且删除缓存中的所述索引对应的所述数据消息。需要说明的是,在主题索引数组、主题集合索引数组以及全局序列索引中的一个索引数组存满并写入索引文件后,就删除缓存中的所述索引对应的所述数据消息。

终端在数组中的索引写入索引文件后清空数组中的索引以及释放索引对应的数据消息,提高了缓存的可用率。

进一步的,参照图5,图5为本发明数据异步持久化方法的第四实施例,在上述图2所示的实施例基础上,所述步骤s10之前,还包括:

步骤s40、获取所述数据信息的存储大小以及共享内存的容量;

步骤s50、在所述数据信息的存储大小小于所述共享内存的容量时,将所述数据信息存储在所述共享内存;

步骤s60、在所述数据信息的存储大小大于所述共享内存的剩余容量时,将所述共享内存中的数据存入硬盘中。

本实施例提供的技术方案中,消息从消息中间件输入进来后,获取所述消息数据的存储大小,然后获取共享内存的容量大小,在所述数据信息的存储大小小于所述共享内存的容量时,将所述数据信息存储在所述共享内存。在所述数据信息的存储大小大于所述共享内存的容量时,则跨文件将所述数据信息保存至硬盘中。

终端将大于共享内存的容量的消息数据存储进磁盘,从而避免所述消息影响异步持久化的效率。

进一步的,参照图6,图6为本发明数据异步持久化方法的第五实施例,在上述图2所示的实施例基础上,所述步骤s30之后,还包括:

步骤s70、在接收到所述消息中间件发送的检索请求时,获取所述检索请求对应的检索索引,其中,所述检索索引可以是主题索引、主题集合索引以及全局序列索引;

步骤s80、获取所述检索索引对应的数据消息;

步骤s90、在获取到所述检索索引对应的数据消息时,将所述数据消息发送至所述消息中间件。

本实施例提供的技术方案中,消息中间件对于输出消息相当于发送者,因此可以只需要建立主题索引。持久化输出线程负责输出消息的持久化,消息中间件按主题区分输出消息,不同主题的消息通过不同的消息队列传输,持久化输出线程在所有的主题消息队列中轮询,有消息时通过回调函数将消息保存到共享内存中,待共享内存满或者超出单个磁盘文件之后再将消息批量持久化,将收到的消息按照主题建立索引,当需要查找异步持久化组件中某个消息的时候只需要查找索引即可快速找到,索引数组满的时候将索引写入磁盘。

终端通过检索索引进行数据检索,从而快速找到主题索引下的数据信息。

进一步的,参照图7,图7为本发明数据异步持久化方法的第六实施例,在上述图6所示的实施例基础上,所述步骤s80之后,还包括:

步骤s100、在未获取到所述检索索引对应的数据消息时,输出未获取到数据消息的提示信息。

所述检索索引可以是主题索引、主题集合索引以及全局序列索引。消息中间件在接收端奥消息获取请求时,根据所述消息生成主题索引,并将所述主题索引发送至异步持久化组件,异步持久化组件在接收到所述消息中间件发送的检索请求时,获取所述检索请求对应的检索索引,并且在持久化的索引文件中找到对应的索引,并获取所述检索索引对应的数据消息,最后在未获取到所述检索索引对应的数据消息时,输出未获取到数据消息的提示信息。

终端在未获取到与所述检索索引对应的数据消息时输出未获取到数据消息的提示信息,从而提醒用户重新输入检索数据消息。

进一步的,参照图8,图8为本发明数据异步持久化方法的第七实施例,在上述图2所示的实施例基础上,所述步骤s30之后,还包括:

步骤s110、在接收到恢复系统数据请求时,获取所述系统故障信息对应的故障类型;

步骤s120、获取所述故障类型对应的恢复程序,并根据所述恢复程序恢复所述共享内存中的数据消息。

本实施例提供的技术方案中,所述故障类型包括消息数据输入异步持久化故障以及消息数据输出异步持久化故障。

进一步地,在故障类型为消息数据输入异步持久化故障时,所述消息数据输入异步持久化故障又包括两种故障,第一种,异步持久化组件组件由于写文件、读共享内存队列、自身软件缺陷等原因故障;第二种,机器故障。第一种情况下,共享内存中的索引数据依然存在,异步持久化组件只需要恢复持久化功能即可。第二种情况下,共享内存中的未持久化的索引已经丢失。自身故障的异步持久化组件的恢复过程就是不断从消息队列中获取未释放的消息,如果拿到的是非故障期间的消息,从异步写入流程中可以推导这个消息的索引一定在共享内存或者索引文件中,如果索引数组的索引计数器等于0,将共享内存和文件中的索引取并集。如果从共享内存中拿到的消息索引不齐全,则判定所述消息是故障瞬间的消息,从消息队列获取所述消息,如果不是第一个消息或者没有超过最大索引,那么对数据滤重并写入共享内存中,如果是第一个消息或者超过索引数组范围,倒序查找三级索引如果没有找到则建立索引并保存数据,直到处理完消息队列中所有的消息。最后启动定时器线程,异步持久化组件恢复故障进入正常服务状态。可以理解的是,异步持久化组件自身故障输出持久化的流程和输入持久化的恢复流程类似,从消息队列中获取消息倒序检索的时候只需要检索主题索引即可。

进一步地,在故障类型为消息数据输出异步持久化故障时,所述消息数据输出异步持久化故障又包括两种故障,第一种,异步持久化组件组件由于写文件、读共享内存队列、自身软件缺陷等原因故障;第二种,机器故障。第一种情况下,共享内存中的索引数据依然存在,异步持久化组件只需要恢复持久化功能即可。第二种情况下,异步持久化组件重启后消息队列和共享内存中的数据丢失,因此只能从持久化文件中恢复异步持久化组件状态。但是由于是异步持久化,在故障期间可能丢失大量的数据和索引,造成索引不完整和数据丢失,索引机器故障情况下的异步持久化组件异步持久化故障恢复必须以数据文件为基准,重新恢复多级索引。依据数据文件,先恢复数据的全局序列索引,然后从头扫描数据文件,重新建立连续的主题索引和主题集合索引。可以理解的是,机器故障后异步持久化组件输出文件恢复过程和输入类似,倒序扫描输出的异步持久化主题索引文件,如果索引对应的数据不存在,继续扫描直到找到数据文件,然后将不完整的索引和数据文件截断。如果主题索引找到对应的数据,则变成从前往后扫描数据文件,依据该数据文件建立主题索引,最后将残余的数据文件截断。

终端在异步持久化组件出现故障时根据三级索引恢复数据,从而提高了数据存储的安全性。

为实现上述目的,本发明还提供一种数据异步持久化装置,所述数据异步持久化装置包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的数据异步持久化程序,所述数据异步持久化程序被所述处理器执行时实现如上所述的数据异步持久化方法的步骤。

为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有数据异步持久化程序,所述数据异步持久化程序被处理器执行时实现如上所述的数据异步持久化方法的步骤。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是电视机,手机,计算机,装置,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1