一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于Redis的消息处理方法和设备与流程

2022-02-22 10:16:15 来源:中国专利 TAG:

一种基于redis的消息处理方法和设备
技术领域
1.本发明涉及消息处理领域,特别是指一种基于redis的消息处理方法和设备。


背景技术:

2.消息是信息的载体,是通信系统的传输对象。在接收到的消息需要进行处理时,通常会涉及到对消息的存储。redis是一个高性能的键值(key-value)数据库,key-value是一种以键值对存储数据的数据库类型,具有高并发读写性能。
3.队列可以被看作是存放消息的容器,在消息传输过程中,消息被写入这个容器中,之后再从这个容器中读取消息,并将读取的消息进行转发。在现有技术基于redis的消息处理过程中,通常将接收到的消息直接写入redis消息队列中,在需要读取消息时直接从所述redis消息队列中进行读取。由于接收到的消息通常存放在同一个redis消息队列中,在实际应用过程中,消息可能会存在多个类型,在某一个类型的消息在处理过程中出错的时候,可能会对其他类型的消息处理过程产生影响,进而导致整个消息处理系统出现问题;而且,在进行消息处理的过程中可能会出现处理能力不足的现象。因此,在现有技术消息处理过程中,不同类型消息之间的相互影响程度较大,并且难以对消息进行流量控制。


技术实现要素:

4.有鉴于此,本技术实施例提供一种基于redis的消息处理方法和设备,用以降低在消息处理过程中不同类型消息之间的相互影响,以及对消息进行流量控制。
5.第一方面,本技术实施例提供一种基于redis的消息处理方法,所述处理方法包括:
6.根据报文得到消息的消息类型;
7.根据所述消息类型得到与所述消息类型对应的redis消息队列;其中,不同的消息类型对应有不同的redis消息队列;
8.判断所述redis消息队列的当前深度是否超过预设的深度阈值,若否,则将所述消息写入所述redis消息队列中。
9.在一种可能的实现方式中,所述根据报文得到消息的消息类型包括:根据所述报文得到消息内容对应的内容类型,以所述内容类型作为所述消息类型。
10.在一种可能的实现方式中,所述根据报文得到消息的消息类型包括:根据所述报文得到报文格式对应的格式类型,以所述格式类型作为所述消息类型。
11.在一种可能的实现方式中,所述将所述消息写入所述redis消息队列中还包括:为所述消息设置过期时间;对于redis消息队列中超过所述过期时间的消息,进行销毁处理。
12.在一种可能的实现方式中,redis位于redis集群的节点上,其中,所述redis集群各节点上的redis同步共享数据。
13.第二方面,本技术实施例提供一种基于redis的消息处理方法,根据消息类型确定消息读取线程,其中,不同的消息类型对应于不同的读取线程,所述处理方法包括:
14.通过所述读取线程,按照消息写入的时间顺序,从与所述读取线程对应的redis消息队列中读取消息;其中,所述消息是根据权利要求1所述的方法写入所述redis消息队列中的。
15.在一种可能的实现方式中,所述从redis消息队列中读取消息包括:在执行读取命令之后,若未获得所述读取命令对应的消息,则在预设的阻塞时间内进行等待,直到获得所述消息,以所述消息作为读取的结果。
16.第三方面,本技术实施例提供一种基于redis的消息处理设备,所述消息处理设备包括获取模块、判断模块和写入模块,其中:
17.所述获取模块,用于根据报文得到消息的消息类型;根据所述消息类型得到与所述消息类型对应的redis消息队列;其中,不同的消息类型对应有不同的redis消息队列;
18.判断模块,用于判断所述redis消息队列的当前深度是否超过预设的深度阈值;
19.写入模块,用于当所述redis消息队列的当前深度是否超过预设的深度阈值的判断结果为否时,将所述消息写入所述redis消息队列中。
20.在一种可能的实现方式中,所述消息处理设备还包括读取模块,其中,所述读取模块用于通过所述读取线程,按照消息写入的时间顺序,从与所述读取线程对应的redis消息队列中读取消息;所述消息读取线程是根据消息类型确定的,不同的消息类型对应于不同的读取线程。
21.在一种可能的实现方式中,所述消息处理设备包括网关设备。
22.在现有技术中,由于消息通常存放在同一个redis消息队列中,当某一个类型的消息在处理过程中出错,会对其他类型的消息产生较大的影响。例如,某一个类型的消息在处理过程中出错,该错误类型的消息一直存放在redis队列中,在这种情况下,随着消息的不断写入,redis消息队列深度会不断增加。当队列深度较大时,从该redis消息队列中读取其他正常类型的消息所需要占用的资源可能会增加,也可能会进一步导致其他正常类型的消息处理过程出错。在本技术实施例中,根据报文得到的消息类型,将所述消息写入与所述消息类型对应的redis消息队列中,由于不同的redis消息队列对应有不同的消息类型,不同类型的消息会被存放在不同的redis消息队列中。当某一个类型的消息出错时,由于其他类型的消息被存放于各自对应的redis消息队列中,能够降低该错误类型的消息对其他正常类型的消息的影响。在本技术实施例中,在将消息写入redis消息队列之前,判断所述redis消息队列的当前深度是否超过预设的深度阈值,在当前深度没有超过预设的深度阈值时,进行对所述消息的写入。例如,队列当前深度较大表明需要处理的消息过多,可能会出现处理能力不足的现象,导致过多的消息无法及时进行处理,通过在消息写入之前判断当前深度是否超过阈值,能够实现对于消息进行流量控制。
23.本技术实施例还有其他的有益效果。
24.redis位于redis集群的节点上,所述redis集群各节点上的redis同步共享数据,通过利用redis集群,在redis集群某一个节点出故障的情况下,能够通过其他节点完成通信,在一定程度上避免了单点故障;通过对所述消息进行过期时间的设置,对于超过过期时间的消息进行例如销毁的处理,能够在一定程度上保证消息的有效性;对于队列中的消息,采用先进先出的读写方法,先写入的消息优先进行处理;阻塞性读操作在一定程度上解决了在队列没有数据的情况下,一直循环消耗系统的资源。在队列没有数据时,进入休眠状
态,当有数据进入队列之后,会继续执行读取任务。可以设定阻塞时间。在执行读取命令之后,若未获得所述读取命令对应的消息,则在预设的阻塞时间内进行等待,直到获得所述消息,并以所述消息作为读取的结果返回,通过阻塞型读操作能够在未读取到消息时进行等待,而非重复执行读取操作,在阻塞时间结束之后再进行下一次读取。例如在读写同步进行的情况中,在执行读取操作时,redis消息队列中可能还未被写入消息,所以不能读取到消息,如果在预设的阻塞时间内进行等待,在该阻塞时间内可能会存在消息的写入,此时可以直接返回获得到的消息,而不需要进行下一次读取操作再返回所述消息。
附图说明
25.图1为本技术实施例提供的基于redis的消息处理方法的流程图;
26.图2为本技术另一实施例提供的基于redis的消息处理方法的流程图;
27.图3为本技术实施例提供的一种基于redis的消息处理设备的结构示意图;
28.图4为本技术实施例提供的另一种基于redis的消息处理设备的结构示意图。
具体实施方式
29.为了便于理解和解释本技术实施例提供的技术方案,下面将先对本技术实施例中的技术术语进行说明。
30.redis全称是远程数据服务(remote dictionary server),是一种键值(key-value)数据库,支持丰富的数据类型,如string、list、set等。
31.键值数据库:采用hash(哈希)表结构存储,具有简单、易部署的特点,常见的有redis、memcachadb。
32.redis集群(redis cluster):提供一种方法用于运行redis服务,在多个节点之间自动分享数据。redis cluster在分区期间也提供了一定程度的可用性,也就是在实际操作中,当一些节点发生故障或无法通信时,能够继续操作。但是在发生较大的故障时(例如大部分主节点不可用时),集群就会停止运行。能够在多个节点之间自动拆分数据集的功能。当一部分节点出现故障或无法与集群的其余部分通信时,继续运行的能力。redis集群采用无中心结构,每个节点存储数据和整个集群状态,每个节点和其他所有节点连接,即所有的节点彼此互联。需要使用redis集群时,客户端和redis节点直连,不需要连接集群所有节点,连接集群中任何一个可用节点即可。
33.队列:队列可以被看作是存放消息的容器,在消息传输的过程中,消息被投递至这个容器中,再从这个容器被取出并进行转发。
34.为了便于理解本技术实施例提供的技术方案,下面结合附图对本技术实施例提供的一种基于redis的消息处理方法和设备进行说明。虽然附图中显示了本技术的示例性实施例,然而应当理解,可以以各种形式实现本技术而不应被这里阐述的实施例所限制。基于本技术中的实施例,本领域技术人员在没有作出创造性贡献前提下所获得的其他实施例,都属于本技术的保护范围。
35.还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵
盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
36.现有技术通常将接收到的消息直接写入到同一个redis消息队列,读取时直接从该redis消息队列中读取,而消息可能会存在多个类型,某一个类型的消息出错时可能会影响其他类型的消息;而且在进行消息处理的过程中可能会出现业务处理系统能力不足的现象。本技术实施例根据报文得到的消息类型,将所述消息写入与所述消息类型对应的redis消息队列中,由于不同的redis消息队列对应有不同的消息类型,不同类型的消息会被存放在不同的redis消息队列中;以及通过在消息写入之前判断当前深度是否超过阈值,能够实现降低在消息处理过程中不同类型消息之间的相互影响,以及对消息进行流量控制。
37.请参阅图1,图1为本技术实施例提供的基于redis的消息处理方法的流程图。如图1所示,本技术实施例中基于redis的消息分发方法包括以下步骤:
38.s101、根据报文得到消息的消息类型;
39.在s101中,所述根据报文得到消息的消息类型的作用是区分出所述消息的类型,为后续将所述消息写入哪一个队列提供依据。在接收到消息后,根据所述消息的内容和/或格式等信息,可以得到所述消息的类型。
40.s102、根据所述消息类型得到与所述消息类型对应的redis消息队列;其中,不同的消息类型对应有不同的redis消息队列;
41.在s102中,所述根据所述消息类型得到与所述消息类型对应的redis消息队列的作用,是为将不同类型的消息写入哪一个队列提供依据;所述不同的消息类型对应有不同的redis消息队列的作用,是为了将不同类型的消息存储于不同的队列中,减小在消息处理过程中不同类型之间的相互影响。
42.s103、判断所述redis消息队列的当前深度是否超过预设的深度阈值,若否,则将所述消息写入所述redis消息队列中。
43.在s103中,所述判断所述redis消息队列的当前深度是否超过预设的深度阈值,若否,则将所述消息写入所述redis消息队列中,即在所述redis消息队列的当前深度小于或者等于预设的深度阈值时,将所述消息写入所述redis队列中,s103的作用是对消息进行流量控制。随着消息被写入到redis消息队列中,队列深度逐渐增加,在消息过多的情况下,例如当消息大于处理系统能力范围时,对消息进行流量控制,在一定程度上避免了将消息存放于队列中,而无法及时进行其他处理。经过s103后,满足条件的消息被写入与所述消息的消息类型对应的redis队列中。
44.进一步地,在s101中,对于根据报文得到消息的消息类型,可以根据所述报文得到消息内容对应的内容类型,以所述内容类型作为所述消息类型,上述步骤的目的是通过消息内容对消息进行区分。报文数据中包含有接收到消息的消息内容,为了区分接收到的消息,可以将消息内容作为区分依据,不同的消息内容划分为不同的消息类型。例如,第一消息的内容类型为第一内容类型,第二消息的内容类型为第二内容类型,则所述第一消息和所述第二消息分别位于不同的两个redis消息队列。可以理解地是,所述根据报文得到消息的消息类型,是否包括根据所述报文得到消息内容对应的内容类型,不影响本技术实施例
的实现。
45.进一步地,在s101中,对于根据报文得到消息的消息类型,可以根据所述报文得到报文格式对应的格式类型,以所述格式类型作为所述消息类型,上述步骤的目的是通过报文格式对消息进行区分。报文数据中包含有报文格式,不同报文格式的消息可能来自于不同的终端系统,为了区分接收到的消息,可以将消息来自哪个终端系统作为区分依据,来自于不同系统的消息划分为不同的消息类型。例如,第一消息的格式类型为第一格式类型,第二消息的格式类型为第二格式类型,则所述第一消息和所述第二消息分别位于不同的两个redis消息队列。可以理解地是,所述根据报文得到消息的消息类型,是否包括根据所述报文得到报文格式对应的格式类型,不影响本技术实施例的实现。
46.进一步地,在s101中,对于根据报文得到消息的消息类型,可以根据所述报文得到消息内容对应的内容类型和报文格式对应的格式类型,同时以所述内容类型和格式类型作为消息的分类依据,不同内容类型、不同格式类型的消息均是不同消息类型的消息。例如,对于第一消息来说,内容类型为第一内容类型,格式类型为第一格式类型;对于第二消息来说,内容类型为第二内容类型,格式类型为第二格式类型;对于第三消息来说,内容类型为第一内容类型,格式类型为第二格式类型;对于第三消息来说,内容类型为第二内容类型,格式类型为第一格式类型,在这种情况下,所述第一消息、所述第二消息、所述第三消息和所述第四消息分别被写入不同的四个redis消息队列。可以理解地是,是否根据所述报文得到消息内容对应的内容类型和报文格式对应的格式类型,同时以所述内容类型和格式类型作为消息的分类依据,不影响本技术实施例的实现。
47.进一步地,在s103中,对于将所述消息写入所述redis消息队列中,可以为所述消息设置过期时间,对于redis消息队列中超过所述过期时间的消息,进行销毁处理。上述步骤的作用是在一定程度上保证消息的有效性。可以理解地是,是否为所述消息设置过期时间,不影响本技术实施例的实现。
48.进一步地,在s103中,对于所述判断所述redis消息队列的当前深度是否超过预设的深度阈值,可以当判断结果为是,则将所述消息写入错误列队中。在s103中,当判断所述redis消息队列的当前深度小于或者等于所述预设的深度阈值时,将所述消息写入所述redis消息队列中;而当判断所述redis消息队列的当前深度大于所述预设的深度阈值时,可以将所述消息写入错误队列中,所述错误队列用于当redis消息队列当前深度大于阈值时存放接收到的消息。上述将所述消息写入错误队列中的作用,考虑到消息较多时,消息处理系统能力可能不足以完成对消息的处理,在这种情况下,将接收到的消息存放于错误队列中,对于错误队列中的消息,处理系统不对其进行处理。进一步地,对于所述错误队列中消息的处理,可以根据实际情况而设定。进一步地,当判断所述redis消息队列的当前深度大于所述预设的深度阈值时,可以返回错误响应。可以理解地是,当判断所述redis消息队列的当前深度超过预设的深度阈值时,是否将所述消息写入错误列队中,不影响本技术实施例的实现。
49.进一步地,redis可以位于redis集群的节点上,所述redis集群各节点上的redis同步共享数据。为了提高数据的高可用性,redis集群可以采用主从模式。一个主节点对应有一个或者多个从节点,其中,主节点提供数据存取,从节点则是从主节点拉取数据进行备份,当主节点出现故障,可以选取一个从节点充当主节点,从而降低redis不可用的情况出
现,这种集群去中心化的方法,能够在一定程度上避免了单点故障的出现。进一步地,可以在使用redis时进行redis集群的连接,在结束使用redis时关闭redis集群的连接。可以理解地是,是否以redis集群的方式实现本技术实施例,不影响本技术实施例的实现。
50.在图1所对应的本技术实施例中,主要涉及将信息的写入redis消息队列的过程,在下文图2所对应的本技术实施例中,主要涉及从redis消息队列中读取消息的过程。
51.请参阅图2,图2为本技术另一实施例提供的基于redis的消息处理方法的流程图。根据消息类型确定消息读取线程,其中,不同的消息类型对应于不同的读取线程。如图2所示,本技术实施例基于redis的消息处理方法包括以下步骤:
52.s201、根据报文得到消息的消息类型;
53.s202、根据所述消息类型得到与所述消息类型对应的redis消息队列;其中,不同的消息类型对应有不同的redis消息队列;
54.s203、判断所述redis消息队列的当前深度是否超过预设的深度阈值,若否,则将所述消息写入所述redis消息队列中;
55.s204、通过所述读取线程,按照消息写入的时间顺序,从与所述读取线程对应的redis消息队列中读取消息。
56.在s204中,所述按照消息写入redis的时间顺序,从对应的redis消息队列中读取消息的作用,是对于队列中的消息,采用先进先出的读写方法,先写入的消息优先进行处理。s204中读取的消息是通过图1对应的本技术实施例中的方法进行写入的。在s204中,由于消息是根据不同的消息类型写入到不同的redis消息队列,在进行读取时,启动多个线程进行消息的读取,各线程用于读取不同队列中的消息,不同的读取线程对应于不同的消息类型。
57.进一步地,在s204中,对于所述从redis消息队列中读取消息,可以在执行读取命令之后,若未获得所述读取命令对应的消息,则在预设的阻塞时间内进行等待,直到获得所述消息,以所述消息作为读取的结果。上述步骤的作用是设置阻塞读操作。通过进行阻塞型读操作,在执行读取命令之后,若未获得所述读取命令对应的消息,则在预设的阻塞时间内进行等待,直到获得所述消息,并以所述消息作为读取的结果返回,通过阻塞型读操作能够在未读取到消息时进行等待,而非重复执行读取操作,在阻塞时间结束之后再进行下一次读取。例如,在读写同步进行的情况中,在执行读取操作时,redis消息队列中可能还未被写入消息,所以不能读取到消息,如果在预设的阻塞时间内进行等待,在该阻塞时间内可能会存在消息的写入,此时,可以直接返回获得到的消息,而不需要进行下一次读取操作再返回所述消息。可以理解地是,是否设置阻塞读操作不影响本技术实施例的实现。
58.进一步地,本技术实施例提供一种确定队列名称组成方法和名称关键词的方法,本方法涉及三种key,可以使用以下三种key可能的命名方法。第一种是自增序列,redis方法关键词为inc,key命名为“inc:type:fmt”,其中,type为消息类型,fmt为消息格式,value为一个数值,value在每调用一次增加1;第二是用于保存消息的key-value,key命名为“key:type:fmt:a”,其中,a为通过自增序列得到的value值,而在第二种方法中的value为消息本身;第三种为队列,队列命名为“list:type:fmt”,其中,value为程序运行过程中第二种的key。由于redis不能直接为list(队列)设置过期时间,因此本技术实施例提供一种将key放入队列,并且为key设置过期时间,用以实现为消息设置过期时间的方法,从而提高
消息的有效期。本技术实施例还提供一种实现消息写入的方法。通过命令incr返回自增的数字,“incr inc:type:fmt”,其中,type为消息类型,fmt为消息格式;通过命令setex将消息放入redis消息队列中,设置消息的有效期“setex key:type:fmt:a 500message”,其中,500为消息有效期,message为放入队列的消息;通过命令lpush将上一步的key放入队列中并返回队列深度“lpush list:type:fmt key:type:fmt:a”。本技术实施例还提供一种实现阻塞读操作的方法。通过brpop命令实现阻塞时间的设置“brpop list:type:fmt10”,其中,type为消息类型,fmt为消息格式,返回队列中报文key,即“key:type:fmt:a”;通过get命令得到消息,或者在消息为空时循环brpop指令“get key:type:fmt:a”,通过llen命令返回当前队列深度“llen list:type:fmt”。
59.在上述本技术实施例中,主要涉及从redis消息队列中读取消息的过程。下面结合一具体场景对本技术基于redis的消息处理方法的具体实现进行描述。在本具体场景中,本技术的技术方案应用于银行业务消息处理场景。
60.在银行业务场景中,待处理的消息可以包括二维码交易消息,过路交易消息,现金交易消息三种不同类型的消息,通过交易分发网关对消息进行写入和读取的处理,通过内部业务处理系统对交易消息进行业务处理。
61.交易分发上游网关连接外部交易系统,接收来自外部交易系统的交易消息;交易分发网关下游连接内部业务系统,接收内部业务系统处理的消息。
62.交易分发上游网关包括请求线程、正常响应线程以及错误响应进程。
63.交易分发上游网关接收到外部交易系统的消息之后,请求线程根据报文得到所述消息的消息类型,并且根据所述消息类型得到与所述消息类型对应的redis请求队列,在所述redis请求队列的当前深度小于或等于预设的深度阈值时,调用redis写方法将所述消息写入与所述消息类型对应的redis请求队列中,不同的消息类型对应有不同的redis请求队列。预设的深度阈值用于判断当前队列深度是否超过系统处理能力,如果队列深度超过阈值,则不再对所述redis请求队列中写入消息,而是调用redis写方法根据规则写入消息到错误响应队列中,以实现流量控制。正常响应线程用于调用redis读方法,从正常响应队列中读取消息,返回给交易外部系统;错误进程用于调用redis读方法,从错误响应队列中读取消息,返回错误响应给外部业务系统。可以理解地是,上游网关连接有外部交易系统,可以根据交易消息类型将上游网关分为不同交易类型的上游网关,例如二维码交易类型上游网关、过路交易类型上游网关等等。
64.交易分发下游网关根据不同的消息类型连接有内部业务系统的不同业务模块。下游网关根据交易消息的消息类型启动多组线程,每一组线程对应一组交易类型,每种交易类型对应的线程分别包含有请求线程和响应线程。例如,a类型交易消息对应的请求进程用于调用redis读方法,读取a类型对应的redis请求队列,将报文发送给a类型上游网关,在接收到a类型上游网关的响应后,a类型交易消息对应的响应进程将来自于业务处理系统的业务处理结果对应的消息写进a类型对应的redis响应队列,或者写入错误响应队列。当请求线程读取redis请求队列时,检查所述队列的队列深度,如果当前队列深度超过预设的深度阈值,表明当前消息流量超过了上游网关处理能力,则不再向上游网关发送数据,而是根据规则将数据写入到错误应答队列,以便实现流量控制。可以理解地是,上述通过线程进行处理也可以为通过进程进行处理;可以采用redis集群完成上述过程。
65.请参阅图3,图3为本技术一实施例提供的基于redis的消息处理设备的结构示意图。如图3所示,本技术实施例基于redis的消息处理设备300包括获取模块301、判断模块302和写入模块303,其中:
66.所述获取模块301,用于根据报文得到消息的消息类型;根据所述消息类型得到与所述消息类型对应的redis消息队列;其中,不同的消息类型对应有不同的redis消息队列;
67.所述判断模块302,用于判断所述redis消息队列的当前深度是否超过预设的深度阈值;
68.所述写入模块303,用于当所述redis消息队列的当前深度是否超过预设的深度阈值的判断结果为否时,将所述消息写入所述redis消息队列中。
69.请参阅图4,图4为本技术另一实施例提供的基于redis的消息处理设备的结构示意图。如图4所示,本技术实施例基于redis的消息处理设备400包括获取模块401、判断模块402、写入模块403和读取模块404,其中:
70.所述获取模块401,用于根据报文得到消息的消息类型;根据所述消息类型得到与所述消息类型对应的redis消息队列;其中,不同的消息类型对应有不同的redis消息队列;
71.所述判断模块402,用于判断所述redis消息队列的当前深度是否超过预设的深度阈值;
72.所述写入模块403,用于当所述redis消息队列的当前深度是否超过预设的深度阈值的判断结果为否时,将所述消息写入所述redis消息队列中;
73.所述读取模块404,用于通过所述读取线程,按照消息写入的时间顺序,从与所述读取线程对应的redis消息队列中读取消息;所述消息读取线程是根据消息类型确定的,不同的消息类型对应于不同的读取线程。
74.对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本技术。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本技术的精神或范围的情况下,在其它实施例中实现。因此,本技术将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献