消息转发系统中存储消息的方法和装置.pdf

上传人:小** 文档编号:1004220 上传时间:2018-03-24 格式:PDF 页数:31 大小:1.35MB
返回 下载 相关 举报
摘要
申请专利号:

CN200810166811.3

申请日:

2008.09.24

公开号:

CN101686209A

公开日:

2010.03.31

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):H04L 12/58申请日:20080924|||公开

IPC分类号:

H04L12/58; G06F17/30

主分类号:

H04L12/58

申请人:

阿里巴巴集团控股有限公司

发明人:

岳旭强; 曾宪杰

地址:

英属开曼群岛大开曼岛资本大厦一座四层847号邮箱

优先权:

专利代理机构:

北京集佳知识产权代理有限公司

代理人:

逯长明

PDF下载: PDF下载
内容摘要

本发明提供了消息转发系统中存储消息的方法和装置,所述方法包括:将消息按顺序添加至当前数据文件;生成所述消息的第一索引日志,并将第一索引日志放入内存中。与现有技术不同的是,在本发明实施例中,将消息的索引放入内存中,这样在读取消息时,就可以直接从内存的索引中根据消息ID,从硬盘上的数据文件里获取消息内容,从而减少了对硬盘的随机读写次数,也减少了对硬盘上文件的随机读写次数,提升了文件性能,进一步的,当系统重启的时候,还可以根据已经保存的日志文件恢复内存中的索引。

权利要求书

1、  一种消息转发系统中存储消息的方法,其特征在于,该方法包括:
将消息按顺序添加至硬盘中的当前数据文件;
生成所述消息的第一索引日志;
将所述第一索引日志放入内存中。

2、
  如权利要求1所述的方法,其特征在于,所述生成所述消息的第一索引日志之后,还包括:
将所述第一索引日志顺序添加至硬盘中的日志文件,所述日志文件用于保存消息的索引日志。

3、
  如权利要求1所述的方法,其特征在于,所述将消息按顺序添加至硬盘中的当前数据文件之前,还包括:
在内存中根据消息ID尝试获取相应的索引日志,当获取不到时,查找用于存储消息的当前数据文件。

4、
  如权利要求3所述的方法,其特征在于,所述查找用于存储消息的当前数据文件之后,还包括:
判断所述当前数据文件的大小是否大于一个阈值,如果是,则创建新数据文件,并将所述新数据文件设置为当前数据文件,如果否,则维持所述当前数据文件不变。

5、
  如权利要求2所述的方法,其特征在于,所述将所述索引日志放入内存中之后,还包括:
对系统进行初始化,以根据所述日志文件中索引日志的内容,在内存中恢复索引日志。

6、
  如权利要求1所述的方法,其特征在于,所述将消息按顺序添加至当前数据文件之后,还包括:
增加所述当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。

7、
  如权利要求1所述的方法,其特征在于,所述将所述第一索引日志放入内存中具体包括:
将消息ID与所述第一索引日志以key和value的形式放入内存中,所述key为消息ID,所述value为所述第一索引日志。

8、
  如权利要求1-7任一项所述的方法,其特征在于,所述第一索引日志操作的内容包括:存储操作、消息ID、文件序列、偏移量和/或消息长度。

9、
  如权利要求8所述的方法,其特征在于,所述将所述消息顺序写入所述当前数据文件的具体实现为:
将所述消息转换为字节流;
在当前数据文件中顺序添加所述字节流。

10、
  一种消息转发系统中的存储装置,其特征在于,包括:
第一添加模块,用于将消息按顺序添加至硬盘中的当前数据文件;
第一生成模块,用于生成所述消息的第一索引日志;
保存模块,用于将所述第一索引日志放入内存中。

11、
  如权利要求10所述的装置,其特征在于,还包括:
第二添加模块,用于将所述第一索引日志顺序添加至硬盘中的日志文件,所述日志文件用于保存消息的索引日志。

12、
  如权利要求10所述的装置,其特征在于,还包括:
第一获取模块,用于在内存中根据消息ID尝试获取相应的索引日志;
查找模块,用于当所述获取模块获取不到索引日志时,查找硬盘中用于存储消息的当前数据文件。

13、
  如权利要求12所述的装置,其特征在于,还包括:
第一判断模块,用于判断所述当前数据文件的大小是否大于一个阈值,如果是,则创建新数据文件,并将所述新数据文件设置为当前数据文件,如果否,则维持所述当前数据文件不变。

14、
  如权利要求11所述的装置,其特征在于,还包括:
初始化模块,用于对系统进行初始化,以根据所述日志文件中索引日志的内容,在内存中恢复索引日志。

15、
  如权利要求10所述的装置,其特征在于,还包括:
增加模块,用于增加所述当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。

16、
  如权利要求10所述的装置,其特征在于,所述第一添加模块包括:
第一转换子模块,用于将所述消息转换为字节流;
添加子模块,用于在当前数据文件中顺序添加所述字节流。

17、
  一种消息转发系统中获取消息的方法,其特征在于,包括:
根据消息ID从内存中获取消息的第一索引日志;
根据所述第一索引日志从当前数据文件中获取所述消息的内容。

18、
  如权利要求15所述的方法,其特征在于,所述第一索引日志的内容包括:存储操作、消息ID、文件序列、偏移量和/或消息长度。

19、
  如权利要求18所述的方法,其特征在于,所述根据所述第一索引日志从当前数据文件中获取所述消息的内容,具体包括:
获取所述第一索引日志中的文件序列、偏移量和消息长度;
依据所述文件序列定位当前数据文件,并根据所述偏移量和消息长度从所述当前数据文件中获取字节流;
将所述字节流转换为消息。

20、
  一种消息转发系统中获取消息的装置,其特征在于,包括:
第二获取模块,用于根据消息ID从内存中获取消息的第一索引日志;
第三获取模块,用于根据所述第一索引日志从当前数据文件中获取所述消息的内容。

21、
  如权利要求20所述的装置,其特征在于,所述第一索引日志的内容:包括存储操作、消息ID、文件序列、偏移量和/或消息长度。

22、
  如权利要求21所述的装置,其特征在于,所述第三获取模块包括:
第一获取子模块,用于获取第一索引日志中的当前数据文件的文件序列、偏移量和消息长度;
定位子模块,用于依据所述文件序列定位存储该消息的数据文件;
第二获取子模块,用于根据所述偏移量和消息长度从所述数据文件中获取字节流;
第二转换子模块,用于将所述字节流转换为消息。

23、
  一种消息转发系统中删除消息的方法,其特征在于,该方法包括:
依据消息的第一索引日志生成第二索引日志,所述第一索引日志为将消息添加至当前数据文件时生成所得;
从内存中删除该消息对应的第一索引日志。

24、
  如权利要求23所述的方法,其特征在于,所述从内存中删除该消息对应的第一索引日志之前,还包括:
将所述第二索引日志顺序添加至日志文件中,所述日志文件用于保存消息的索引日志。

25、
  如权利要求23所述的方法,其特征在于,所述依据消息的第一索引日志生成第二索引日志之前,还包括:
从内存中根据消息ID获取消息的第一索引日志。

26、
  如权利要求23所述的方法,其特征在于,还包括:
减少消息所在的当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。

27、
  如权利要求26所述的方法,其特征在于,还包括:
判断所述当前数据文件的引用计数是否为零,若是,则删除所述当前数据文件和当前日志文件。

28、
  如权利要求23所述的方法,其特征在于,所述第二索引日志中包括:删除操作、消息ID、文件序列、偏移量和/或消息长度。

29、
  一种消息转发系统中删除消息的装置,其特征在于,包括:
第二生成模块,用于依据消息的第一索引日志生成第二索引日志,所述第一索引日志为将消息添加至当前数据文件时生成所得;
删除模块,用于从内存中删除该消息对应的第一索引日志。

30、
  如权利要求29所述的装置,其特征在于,还包括:
第三添加模块,用于将所述第二索引日志顺序添加至日志文件中,所述日志文件用于保存消息的索引日志。

31、
  如权利要求29所述的装置,其特征在于,还包括:
第四获取模块,用于在内存的索引中根据消息ID获取消息的第一索引日志。

32、
  如权利要求29所述的装置,其特征在于,还包括:
减少模块,用于减少消息所在的当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。

33、
  如权利要求29所述的装置,其特征在于,还包括:
第二判断模块,用于判断所述当前数据文件的引用计数是否为零,若是,则删除所述当前数据文件和当前日志文件。

说明书

消息转发系统中存储消息的方法和装置
技术领域
本发明涉及网络数据交互领域,特别是涉及消息转发系统中存储消息的方法和装置。
背景技术
随着互联网的普及,电子邮件(Email)、Java消息服务(Java MessagingService,JMS)等异步通讯工具也开始普及,异步通讯工具一般采用消息转发系统存储消息,因此,对消息转发系统中异步传送消息的要求也越来越高。一般情况下,消息转发系统中异步传送消息的过程为:首先发送方发送一个消息至消息转发系统,消息转发系统将消息进行存储,并通过调度,将消息发送给接收者,如果接收者接收失败,消息转发系统启动重发过程,消息发送成功后,消息转发系统删除所述存储的消息。可以看出,消息转发系统如何存储消息是异步通讯时一个非常重要的环节。
在现有技术中,消息转发系统有以下几种存储消息的方法:
(1)JMS的实现,JMS是Java平台上有关面向消息中间件的技术规范,是一种Java应用程序接口,可以提供创建、发送、接收、读取消息的服务。JMS的实现方法采用数据库作为存储消息的介质。具体的存储消息流程为:接收线程接收到发送方发送的消息,将所述消息保存到数据库中,同时唤醒发送线程,以返回给发送者成功回应;然后,发送线程从数据库获取还未发送的消息向消息接收者发送,发送成功后从数据库中删除该消息。该方法的缺点是,如果消息量较大,消息转发系统就需要存储较大数据量的消息,导致数据库的性能严重降低,而且消息转发系统通过套接字(socket)向数据库存储或者从中获取消息,也会产生不必要的数据库的性能损失,使得数据库的软件硬件成本以及维护成本都相对较高。
(2)采用将一个消息存储到一个文件中的方式。因特网邮件传送代理(Mail Transfer Agent,MTA),是可以将来自邮件用户代理(Mail UserAgent,MUA)的信件转发给指定用户的程序,大部分MTA采用文件作为消息的存储介质,将一个邮件消息存储到一个文件中。其存储过程为:简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)进程接收到邮件消息,并将邮件消息保存一个文件中,同时将该文件加入到发送队列,然后返回给邮件发送者成功回应;MTA再从发送队列中获取到待发送的文件,即是邮件消息,并向邮件接收者发送该文件,发送成功后删除该文件。这种采用一个文件存储一个邮件消息的方法,可以避免采用数据库进行存储的高开发成本和维护成本,但是该方法也存在缺点,采用单个文件存储邮件消息,在邮件数据量较大的情况下,过多的文件会达到文件系统的瓶颈(例如inode个数达到上限)。
(3)部分JMS,例如,ActiveMQ有Kaha的插件,采用将所有消息存储在同一个文件中的存储方法。该方法需要在硬盘上建立索引文件,在该索引文件中记录消息在该文件中的偏移量,则消息转发系统依据所述索引文件的消息存储过程为:接收线程接收到发送方发送的消息,将其保存到当前文件中,根据所述消息内容更新索引文件,然后唤醒发送线程,以返回给发送者成功回应;当需要消息转发系统发送该消息时,发送线程从索引文件中获取待发送消息在当前文件中的偏移量,依据所述偏移量获取消息内容,并向消息接收者发送该消息,发送成功后从文件中删除该消息,最后更新索引文件。这种方法不会使得文件系统达到瓶颈,但是也存在缺点,其中索引文件的引入,使得内存在读写数据的时候,需要重复读写硬盘中的索引文件和保存消息的文件,就造成了物理磁头对硬盘的随机读写次数过高的结果,使得文件的读写性能下降,再者,索引文件的内容无法删除,在系统长时间运行后,也可能造成索引文件过大的现象,占用不必要的硬盘空间。
总之,目前需要本领域技术人员迫切解决的一个技术问题就是:如何能够创新的提出一种消息转发系统中存储消息的方法,以在大数据量的情况下,解决对硬盘上文件的随机读写次数过多造成的文件读写性能下降问题。
发明内容
本发明所要解决的技术问题是提供一种消息转发系统中的存储方法,以在大数据量的情况下,减少对硬盘上文件大量的随机读写操作,并提升文件随机读写的性能。
本发明还提供了一种消息转发系统中存储消息的装置,用以保证上述方法在实际中的实现及应用。
为了解决上述问题,本发明公开了一种消息转发系统中存储消息的方法,包括:
将消息按顺序添加至硬盘中的当前数据文件;
生成所述消息的第一索引日志;
将所述第一索引日志放入内存中。
优选的,所述生成所述消息的第一索引日志之后,还包括:
将所述第一索引日志顺序添加至硬盘中的日志文件,所述日志文件用于保存消息的索引日志。
优选的,所述将消息按顺序添加至硬盘中的当前数据文件之前,还包括:
在内存中根据消息ID尝试获取相应的索引日志,当获取不到时,查找用于存储消息的当前数据文件。
优选的,所述查找用于存储消息的当前数据文件之后,还包括:
判断所述当前数据文件的大小是否大于一个阈值,如果是,则创建新数据文件,并将所述新数据文件设置为当前数据文件,如果否,则维持所述当前数据文件不变。
优选的,所述将所述索引日志放入内存中之后,还包括:
对系统进行初始化,以根据所述日志文件中索引日志的内容,在内存中恢复索引日志。
优选的,所述将消息按顺序添加至当前数据文件之后,还包括:
增加所述当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。
优选的,所述将所述第一索引日志放入内存中具体包括:
将消息ID与所述第一索引日志以key和value的形式放入内存中,所述key为消息ID,所述value为所述第一索引日志。
优选的,所述第一索引日志操作的内容包括:存储操作、消息ID、文件序列、偏移量和/或消息长度。
优选的,所述将所述消息顺序写入所述当前数据文件的具体实现为:
将所述消息转换为字节流;
在当前数据文件中顺序添加所述字节流。
本发明实施例还公开了一种消息转发系统中存储消息的装置,包括:
第一添加模块,用于将消息按顺序添加至硬盘中的当前数据文件;
第一生成模块,用于生成所述消息的第一索引日志;
保存模块,用于将所述第一索引日志放入内存中。
优选的,所述装置还包括:
第二添加模块,用于将所述第一索引日志顺序添加至硬盘中的日志文件,所述日志文件用于保存消息的索引日志;
优选的,所述装置还包括:
第一获取模块,用于在内存中根据消息ID尝试获取相应的索引日志;
查找模块,用于当所述获取模块获取不到索引日志时,查找硬盘中用于存储消息的当前数据文件。
优选的,所述装置还包括:
第一判断模块,用于判断所述当前数据文件的大小是否大于一个阈值,如果是,则创建新数据文件,并将所述新数据文件设置为当前数据文件,如果否,则维持所述当前数据文件不变。
优选的,所述装置还包括:
初始化模块,用于对系统进行初始化,以根据所述日志文件中索引日志的内容,在内存中恢复索引日志。
优选的,所述装置还包括:
增加模块,用于增加所述当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。
优选的,所述第一添加模块包括:
第一转换子模块,用于将所述消息转换为字节流;
添加子模块,用于在当前数据文件中顺序添加所述字节流。
本发明还提供了一种消息转发系统中获取消息的方法,包括:
根据消息ID从内存中获取消息的第一索引日志;
根据所述第一索引日志从当前数据文件中获取所述消息的内容。
优选的,所述第一索引日志的内容包括:存储操作、消息ID、文件序列、偏移量和/或消息长度。
优选的,所述根据所述第一索引日志从当前数据文件中获取所述消息的内容,具体包括:
获取所述第一索引日志中的文件序列、偏移量和消息长度;
依据所述文件序列定位当前数据文件,并根据所述偏移量和消息长度从所述当前数据文件中获取字节流;
将所述字节流转换为消息。
本发明还提供了一种消息转发系统中获取消息的装置,包括:
第二获取模块,用于根据消息ID从内存中获取消息的第一索引日志;
第三获取模块,用于根据所述第一索引日志从当前数据文件中获取所述消息的内容。
优选的,所述第一索引日志的内容:包括存储操作、消息ID、文件序列、偏移量和/或消息长度。
优选的,所述第三获取模块包括:
第一获取子模块,用于获取第一索引日志中的当前数据文件的文件序列、偏移量和消息长度;
定位子模块,用于依据所述文件序列定位存储该消息的数据文件;
第二获取子模块,用于根据所述偏移量和消息长度从所述数据文件中获取字节流;
第二转换子模块,用于将所述字节流转换为消息。
本发明还提供了一种消息转发系统中删除消息的方法,包括:
依据消息的第一索引日志生成第二索引日志,所述第一索引日志为将消息添加至当前数据文件时生成所得;
从内存中删除该消息对应的第一索引日志。
优选的,所述从内存中删除该消息对应的第一索引日志之前,还包括:
将所述第二索引日志顺序添加至日志文件中,所述日志文件用于保存消息的索引日志。
优选的,所述依据消息的第一索引日志生成第二索引日志之前,还包括:
从内存中根据消息ID获取消息的第一索引日志。
优选的,所述方法还包括:
减少消息所在的当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。
优选的,还包括:
判断所述当前数据文件的引用计数是否为零,若是,则删除所述当前数据文件和当前日志文件。
优选的,所述第二索引日志中包括:删除操作、消息ID、文件序列、偏移量和/或消息长度。
本发明还提供了一种消息转发系统中删除消息的装置,包括:
第二生成模块,用于依据消息的第一索引日志生成第二索引日志,所述第一索引日志为将消息添加至当前数据文件时生成所得;
删除模块,用于从内存中删除该消息对应的第一索引日志。
优选的,所述装置还包括:
第三添加模块,用于将所述第二索引日志顺序添加至日志文件中,所述日志文件用于保存消息的索引日志;
优选的,所述装置还包括:
第四获取模块,用于在内存的索引中根据消息ID获取消息的第一索引日志。
优选的,所述装置还包括:
减少模块,用于减少消息所在的当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。
优选的,所述装置还包括:
第二判断模块,用于判断所述当前数据文件的引用计数是否为零,若是,则删除所述当前数据文件和当前日志文件。
与现有技术相比,本发明具有以下优点:
在本发明实施例中,首先将消息按顺序添加至硬盘中的当前数据文件,然后生成所述消息的第一索引日志,最后将第一索引日志放入内存中。本发明通过在内存中增加索引日志,在获取数据时可以通过内存中的索引日志直接从数据文件中获取到消息内容,与现有技术相比,减少了对硬盘上索引文件的随机读写操作,从而可以提升文件的随机读写性能,进一步的,将消息保存在不同的数据文件中,并为数据文件增加一个引用计数,在系统一直运行的情况下,旧的数据文件和日志文件最终都会被删除掉,从而减少了对磁盘空间的占用。
附图说明
图1是本发明一种消息转发系统中存储消息的方法实施例1的流程图;
图2是本发明一种消息转发系统中存储消息的方法实施例2的流程图;
图3是本发明一种消息转发系统中存储消息的装置实施例1的结构框图;
图4是本发明一种消息转发系统中存储消息的装置实施例2的结构框图;
图5是本发明的一种消息转发系统中获取消息的方法实施例1的流程图;
图6是本发明的一种消息转发系统中获取消息的方法实施例2的流程图;
图7是本发明的一种消息转发系统中获取消息的装置优选实施例的结构框图;
图8是应用图7所示的优选实施例获取消息的流程图;
图9是本发明的一种消息转发系统中删除消息的方法实施例的流程图;
图10是本发明的一种消息转发系统中删除消息的装置优选实施例的结构框图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
本发明可用于众多通用或专用的计算装置环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。
本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本发明实施例的核心构思之一在于,在本发明实施例中,可以首先将消息按顺序添加至当前数据文件中,接着生成所述消息的第一索引日志,并将所述第一索引日志顺序添加至日志文件,所述日志文件用于保存消息的日志操作,最后将所述第一索引日志放入内存中。本发明通过在当前数据文件中存储消息,并生成第一索引日志将其保存在日志文件中,同时也将所述第一索引日志保存在内存中,在获取数据时可以根据内存的第一索引日志,直接从数据文件中获取到消息内容,从而在大数据量的情况下,减少了磁头对硬盘上索引文件的随机读写次数,提升了文件的随机读写性能。
参考图1,示出了本发明一种消息转发系统中存储消息的方法实施例1的流程图,可以包括以下步骤:
步骤101:将消息按顺序添加至当前数据文件;
步骤102:生成所述消息的第一索引日志;
步骤103:将所述第一索引日志放入内存中。
在本实施例中,所述数据文件是当前用于存储消息的文件,将消息存储在一个文件中,并在后续到来消息的时候,顺序在文件后面添加该消息的字节流,可以减少对文件随机写的次数;在本实施例中,对消息的操作为存储,因此,所述第一索引日志可以包括存储操作、消息ID、文件序列、偏移量和/或消息长度;其中,索引日志是为了根据消息保存的位置建立的一个映射关系,根据所述索引日志,就可以从数据文件中获取消息的内容,在实际应用中,索引日志的实现方式可以有多种。
在本实施例中,在内存中放入所述索引日志时,是以一个映射文件的形式保存的,将消息ID与所述第一索引日志以key和value的形式放入内存中,所述key为消息ID,所述value为所述第一索引日志;在实际中,可以根据在数据文件中存储消息的操作,获得消息在数据文件的偏移量,根据偏移量、数据文件的序列、消息长度等组成第一索引日志,然后把第一索引日志放到内存的索引映射中;以使得在获取消息的时候,可以根据消息ID从内存中得到偏移量等信息,就可以从数据文件中读到消息。
可以看出,因为采用了在内存中保存消息的索引日志的方法,并在硬盘上建立数据文件以保存消息内容,建立日志文件以记录该消息操作的详细信息,所以在读取消息的时候,直接从内存中就可以根据消息ID获取相应的第一索引日志,根据第一索引日志的内容可以直接从硬盘中找到存储该消息的数据文件,并读取消息,从而减少了对硬盘上文件的随机读写次数,提升了文件的随机读写性能。
参考图2,示出了本发明一种消息转发系统中存储消息的方法实施例2的流程图,可以包括以下步骤:
步骤201:从内存中根据消息ID尝试获取相应的第一索引日志,当获取不到时,查找用于存储消息的当前数据文件;
在实际应用中,为了避免对消息存储的重复操作,可以在存储消息之前,首先在内存中根据消息ID查找是否已经存在该消息的第一索引日志,如果存在,说明该消息已经存储在相应的数据文件中了,则不再进行后续操作,如果获取不到该消息的第一索引日志,再查找用于存储消息的当前数据文件;
步骤202:判断所述当前数据文件的大小是否大于一个阈值,如果是,则进入步骤203,如果否,则进入步骤204;
判断当前用于存储消息的数据文件是否大于一个阈值,这个阈值可以由用户自主设置,这是避免一个数据文件的容量过大的情况采取的措施;
步骤203:创建新数据文件,并将所述新数据文件设置为当前数据文件;
如果当前的数据文件已经大于某一阈值,则新建一个数据文件,并将新建的数据文件设置为当前数据文件;
步骤204:将消息按顺序添加至所述当前数据文件;
优选的,所述步骤204可以包括以下子步骤:
子步骤2041:将所述消息转换为字节流;
在实际中,消息是以字节流的格式保存在数据文件中的;
子步骤2042:在当前数据文件中顺序添加所述字节流;
步骤205:增加所述当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数;
在将消息成功存储至数据文件之后,增加当前数据文件的引用计数,其中所述引用计数用于记录所述当前数据文件中消息的个数,在数据文件增加一个消息时,该数据文件的引用计数加一,可以理解的是,在删除该数据文件的一个消息时,该数据文件的引用计数减一;在系统一直运行的情况下,旧的数据文件所包含的消息最终都会被删除掉,此时引用计数会变成零,就可以将该数据文件删除,保证了硬盘上的文件不会数据量过大;
步骤206:生成所述消息的第一索引日志;
在数据文件中存储消息之后,可以生成该消息的存储日志,所述添加日志操作的内容包括存储操作、消息ID、文件序列、偏移量和/或消息长度;
步骤207:将所述第一索引日志顺序添加至日志文件,所述日志文件用于保存消息的日志操作;
所述日志文件是用于保存消息的索引日志的,可以将对消息进行操作的详细信息生成该消息的一个索引日志,并将该索引日志保存在日志文件中;需要说明的是,在实际应用中,数据文件和日志文件是一一对应的,在进行消息保存时,会在数据文件中添加消息的具体内容,并在相应的日志文件中添加该消息的索引日志;在本实施例中,建立日志文件记录消息操作的目的,主要是用于在系统初始化时,可以根据日志文件中的索引日志,在内存中恢复索引日志;
步骤208:将第一索引日志放入内存中。
其中,在步骤207中,将所述第一索引日志放入内存时,可以将消息ID与第一索引日志以key和value的形式放入内存中,所述key可以为消息ID,所述value可以为所述第一索引日志,可以看出,在内存中的索引其实可以理解为一个映射,根据key的值可以找到对应的value;
优选的,本实施例还可以包括:
步骤209:对系统进行初始化,以根据所述日志文件中记录的索引日志的内容,在内存中恢复索引日志。
初始化时通过日志文件恢复内存中的索引日志,是指系统在重新启动的时候,可以根据日志文件中的内容将消息在内存中的索引日志重新建立出来,具体的过程为:重新启动时读取日志文件中的每条索引日志,如果读取到第一索引日志,则在内存的索引映射中添加该消息的第一索引日志,即是对消息做的存储操作;读取所有的日志文件之后,内存中的索引就已经恢复了,可以进行正常的消息读写操作了。
需要说明的是,所述对系统进行初始化的步骤,不仅可以在存储消息之后进行,也可以在获取消息,或者删除消息之后对系统进行初始化,对系统进行初始化的步骤在何时进行,并不影响本发明的实现,本发明无需对此做出限定。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
为使本领域技术人员更好地理解本发明,以下结合本发明在实际中应用的具体例子对本发明进一步说明。
步骤A1:在内存中根据消息ID尝试获取相应的索引日志,当获取不到时,查找用于存储消息的当前数据文件;
假设在实际中,消息ID为abcd,那么根据消息ID在内存中尝试获取和该消息ID对应的索引日志,当获取不到时,则查找用于存储消息的当前数据文件;
步骤A2:判断所述当前数据文件的大小是否大于一个阈值,如果是,则创建新数据文件,并将所述新数据文件设置为当前数据文件,如果否,则维持所述当前数据文件不变;
在本例子中,将所述阈值设置为64M,则如果当前数据文件的大小大于64M,需要创建新数据文件,并肩所述新数据文件设置为当前数据文件,其中,阈值的设定可以根据实际中硬盘的消息数量,也可以依据用户的实际需求,阈值的大小并不影响本发明的实现,本发明对此并不作出限定;
步骤A3:将所述消息转换为字节流;
在实际中,消息是以字节流的格式保存在数据文件中的;
步骤A4:在当前数据文件中顺序添加所述字节流;
步骤A5:增加所述当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数;
在本例子中,每个数据文件在内存中都有一个引用计数,它与数据文件的对应关系可以用key和value的方式实现,key为数据文件序号,value为引用计数;需要说明的是,因为日志文件和数据文件是一一对应的,因此数据文件1则对应日志文件1,所以引用计数的存在也可以使得旧的日志文件也能被删除;
步骤A6:生成所述消息的第一索引日志;
可以在步骤A4中计算出存储字节流时在数据文件中的偏移量,在本步骤,可以生成消息的第一索引日志,在本例子中,具体的第一索引日志可以如下表所示:

 操作:1byte  消息ID:16byte 文件序列:4byte 偏移量:8byte 消息长度:4byte 0  Abcd 4 100 20K

其中,操作的值为0,可以表示对该消息进行的存储操作,则对应的,将1设置为删除操作,其中,设置时也可以根据需要任意设置数值,本发明并不对此作出限定;
步骤A7:将所述第一索引日志顺序添加至日志文件,所述日志文件用于保存消息的索引日志;
因为文件序列为4,则消息存储的地址为数据文件4,因此将所述第一索引日志也需要添加至日志文件4;
步骤A8:将所述第一索引日志放入内存中。
根据上述的第一索引日志,当用java语言来表示放入索引的过程时,脚本语言为:
Log log=new Log();
log.operation=0;//假设0是指添加消息
log.dataFileSequence=“4”;//数据文件4
log.dataFileOffset=100;//100的偏移量
log.messageLength=20;//消息长度是20
indexMap.put(“abcd”,log);//将消息ID为abcd的日志,放入内存索引
//indexMap是在系统启动的时候就生成好的;比如:Map indexMap=new HashMap( )
综上所述,在本发明实施例中,通过上述方法,将索引日志保存在内存中,并在系统初始化的时候,可以由日志文件来恢复内存中的索引日志,从而可以解决文件的读写性能,并且引入了引用计数的概念,使得旧的数据文件和日志文件都可以被删除,可以保证即便在大数据量的情况下,也能对磁盘的占用相对较小。
与上述本发明一种消息转发系统中存储消息的方法实施例1所提供的方法相对应,参见图3,本发明还提供了一种消息转发系统中存储消息的装置实施例1,在本实施例中,该装置包括:
第一添加模块301,用于将消息按顺序添加至当前数据文件;
第一生成模块302,用于生成所述消息的第一索引日志;
组成模块303,用于将所述第一索引日志放入内存中。
本实施例中,组成模块可以在内存中保存消息的索引日志,第一添加模块可以在硬盘上的数据文件保存消息内容,因此,在读取所述消息的时候,直接从内存中就可以根据消息ID获取相应的第一索引日志,根据第一索引日志的内容可以直接找到存储该消息的数据文件,从而减少了对硬盘上文件的随机读写次数,提升了文件的读写性能。
与上述本发明一种消息转发系统中存储消息的方法实施例2所提供的方法相对应,参见图4,本发明还提供了一种消息转发系统中存储消息的装置的优选实施例2,在本实施例中,该装置包括:
第一获取模块401,用于从内存中根据消息ID尝试获取相应的索引日志;
查找模块402,用于当所述获取模块获取不到索引日志时,查找用于存储消息的当前数据文件;
第一判断模块403,用于判断所述当前数据文件的大小是否大于一个阈值,如果是,则创建新数据文件,并将所述新数据文件设置为当前数据文件,如果否,则维持所述当前数据文件不变;
第一添加模块404,用于将消息按顺序添加至当前数据文件;
优选的,所述第一添加模块可以包括以下子模块:
第一转换子模块4041,用于将所述消息转换为字节流;
添加子模块4042,用于在当前数据文件中顺序添加所述字节流。
增加模块405,用于增加所述当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。
第一生成模块406,用于生成所述消息的第一索引日志;
第二添加模块407,用于将所述第一索引日志顺序添加至日志文件,所述日志文件用于保存消息的日志操作;
所述第二添加模块可以在日志文件中记录该消息操作的详细信息;
组成模块408,用于将所述第一索引日志放入内存中;
优选的,本实施例还可以包括:
初始化模块409,用于对系统进行初始化,以根据所述日志文件中记录的索引日志的内容,在内存中恢复索引日志。
参考图5,示出了本发明的一种消息转发系统中获取消息的方法实施例1的流程图,该方法包括:
步骤501:根据消息ID从内存中获取消息的第一索引日志;
步骤502:根据第一索引日志从当前数据文件中获取所述消息的内容。
需要说明的是,所述第一索引日志的内容包括存储操作、消息ID、文件序列、偏移量和/或消息长度,在获取消息时,根据消息ID可以直接从内存中获取相应的第一索引日志,根据获取到第一索引日志,可以直接从存储消息的数据文件中获取到该消息的内容。
可以看出,用户在内存中直接获取索引日志,与现有技术中将索引文件保存在硬盘上的方法相比,节省了对硬盘上索引文件的读写操作,从而减少了对硬盘上文件的随机读写操作,提升了文件的随机读写性能。
参考图6,示出了本发明的一种消息转发系统中获取消息的方法实施例2的流程图,该方法包括:
步骤601:根据消息ID从内存中获取消息的第一索引日志;
在本实施例中,假设消息ID为abcd,可以理解的是,本步骤获取到的第一索引日志即为:
 操作:1byte  消息ID:16byte 文件序列:4byte 偏移量:8byte 消息长度:4byte 0  Abcd 4 100 20

步骤602:获取所述第一索引日志中的文件序列、偏移量和消息长度;
即是获取数据文件4的信息,100的偏移量,以及长度为20的消息;
步骤603:依据所述文件序列定位所述当前数据文件,并根据所述偏移量和消息长度从所述当前数据文件中获取字节流;
步骤604:将所述字节流转换为消息。
在获取消息时,用java语言实现获取过程的脚本语言如下所示:
Log log=indexMap.get(“abcd”);//根据消息ID获取到第一索引日志
if(log!=null){//如果存在
   Message msg=read Message(log.dataFileSequence,log.dataFileOffset,log.messageLength);//根据数据文件的文件序列序号,偏移量和消息长度来读取消息。
}
参考图7,示出了本发明的一种消息转发系统中获取消息的装置优选实施例的结构框图,该方法包括:
第二获取模块701,用于根据消息ID从内存中获取消息的第一索引日志;
第三获取模块702,用于根据第一索引日志从当前数据文件中获取所述消息的内容;
优选的,所述第二获取模块可以包括以下子模块:
第一获取子模块7021,用于获取第一索引日志中的当前数据文件的文件序列、偏移量和消息长度;
定位子模块7022,用于依据所述文件序列定位存储该消息的数据文件;
第二获取子模块7023,用于根据所述偏移量和消息长度从所述数据文件中获取字节流;
第二转换子模块7024,用于将所述字节流转换为消息。
参考图8,示出了应用图7所示的优选实施例进行获取消息的流程图,可以包括以下步骤:
步骤801:第一获取模块根据消息ID从内存中获取消息的第一索引日志;
步骤802:第一获取子模块获取第一索引日志中的当前数据文件的文件序列、偏移量和消息长度;
步骤803:定位子模块依据所述文件序列定位存储该消息的数据文件;
步骤804:第二获取子模块根据所述偏移量和消息长度从所述数据文件中获取字节流;
步骤805:第二转换子模块将所述字节流转换为消息。
参考图9,示出了本发明的一种消息转发系统中删除消息的方法实施例的流程图,该方法包括:
步骤901:依据消息的第一索引日志生成第二索引日志,所述第一索引日志为将消息添加至当前数据文件时生成所得;
在本步骤中,主要的目的是生成第二索引日志,其中,与前述方法的第一索引日志相对应,所述第二索引日志在实际中具体可以为:
  操作:1byte  消息ID:16byte 文件序列:4byte 偏移量:8byte 消息长度:4byte  1  Abcd 4 100 20

可以看出,所述第二索引日志中包括删除操作、消息ID、文件序列、偏移量和消息长度,其中,表中的数字1代表操作为删除;
步骤902:将所述第二索引日志顺序添加至日志文件中,所述日志文件用于保存消息的索引日志;
步骤904:从内存中删除该消息对应的第一索引日志。
需要说明的是,在本实施例中,所述方法还可以包括:
步骤905:减少消息所在的当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数。
在删除消息之后,需要减少消息所在的当前数据文件的引用计数,这样就可以保证,数据文件的引用计数处于一种更新的状态;
步骤906:判断所述当前数据文件的引用计数是否为零,若是,则删除所述当前数据文件和当前日志文件。
当所述数据文件的引用计数为零时,将当前数据文件和当前日志文件一并删除,节省了大量的硬盘空间。
参考图10,示出了本发明的一种消息转发系统中删除消息的装置优选实施例的结构框图,该装置包括:
第二生成模块1001,用于依据消息的第一索引日志生成第二索引日志,所述第一索引日志为将消息添加至当前数据文件时生成所得;
第三添加模块1002,用于将所述第二索引日志顺序添加至日志文件中,所述日志文件用于保存消息的日志操作;
删除模块1003,用于从内存中删除该消息对应的索引;
第四获取模块1004,用于在内存的索引中根据消息ID获取消息的第一索引日志;
减少模块1005,用于减少消息所在的当前数据文件的引用计数,所述引用计数用于记录所述当前数据文件中消息的个数;
第二判断模块1006,用于判断所述当前数据文件的引用计数是否为零,若是,则删除所述当前数据文件和当前日志文件。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明所提供的一种消息转发系统中存储消息的方法和装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

消息转发系统中存储消息的方法和装置.pdf_第1页
第1页 / 共31页
消息转发系统中存储消息的方法和装置.pdf_第2页
第2页 / 共31页
消息转发系统中存储消息的方法和装置.pdf_第3页
第3页 / 共31页
点击查看更多>>
资源描述

《消息转发系统中存储消息的方法和装置.pdf》由会员分享,可在线阅读,更多相关《消息转发系统中存储消息的方法和装置.pdf(31页珍藏版)》请在专利查询网上搜索。

本发明提供了消息转发系统中存储消息的方法和装置,所述方法包括:将消息按顺序添加至当前数据文件;生成所述消息的第一索引日志,并将第一索引日志放入内存中。与现有技术不同的是,在本发明实施例中,将消息的索引放入内存中,这样在读取消息时,就可以直接从内存的索引中根据消息ID,从硬盘上的数据文件里获取消息内容,从而减少了对硬盘的随机读写次数,也减少了对硬盘上文件的随机读写次数,提升了文件性能,进一步的,当系。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 电学 > 电通信技术


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1