用于存储的数据结构和文件结构仅附加消息?

时间:2017-01-23 14:22:07

标签: algorithm file data-structures

消息是可变大小的数据包,具有唯一的消息ID(整数)。我希望有一个设计/数据结构/算法:

  1. 能够有效地将消息存储在磁盘上,消息的数量可以非常大,长度是可变的。但是没有更新或修改存储的内容。
  2. 能够检索带有消息ID的消息,即返回存储的消息。
  3. 最近存储的消息比旧的消息更频繁地被查询
  4. 每条消息都有一个TTL,需要一种方法来截断带有旧消息的文件
  5. 这种需求的正确数据结构和文件结构是什么?

1 个答案:

答案 0 :(得分:0)

如果我们每秒说五条消息,那么你每天都在谈论五十条消息。

我过去所做的是维护多个文件。如果消息的TTL是以天为单位测量的,那么我每天都有一个消息文件。读取和存储消息的过程为新一天的第一条消息创建一个新文件。通过跟踪收到最后一条消息的日期和时间来实现这一点很简单。

我还为每个消息文件维护一个配对索引文件。这也是一个简单的顺序文件,其中包含每条消息的消息ID和位置。因此,要查找特定日期的消息,请加载当天的文件,对消息ID进行二进制搜索,然后使用相应的位置在消息文件中查找消息。如果消息ID是连续的并且没有数字丢失,则查找在索引内应该非常快。如果您可以丢失数字,那么二分搜索效果很好。只有512K消息,二进制搜索将非常快。

要处理多天,您可以使用查找程序的启动顺序扫描所有每日消息索引的目录,并构建一个包含每天第一条消息的ID的元索引。

要删除旧邮件,您可以让查找程序在启动时删除旧文件,或者让它在每天午夜执行。那时它还可以获取第二天文件中第一条消息的ID。

或者,消息收集器可以在收到新文件的第一条消息时生成一个删除旧文件的任务。您还可以让它通知新日的查找程序,以便查找程序可以更新其元索引。

每天只有512K消息(每秒5个消息,每天大约50万个),你应该可以在内存中保存10天的索引条目而不会出现问题。您的索引将包含消息ID和文件偏移量,因此每个条目的数字为16个字节。 10天时间500万次,就像80兆字节:口袋里的变化。要删除旧条目(每天一次),只需从内存中删除当天的索引。

如果消息具有不同的TTL,那么您可以保留较旧的消息,但要跟踪其TTL。当有人查找过期消息时,您必须在返回之前对过期日期进行二次检查。当然,您必须跟踪每天最长的TTL,以便在所有消息都过期时删除该文件。

这是一个非常低技术的解决方案,但您可以在一天内对其进行编码,并且它的工作效果非常出色。我已经在几个项目中使用它,效果很好。