我应该如何在ETS表中自动将其过期,同时又限制其总大小?

Jak*_*old 5 erlang ets

我有很多分析数据,我希望每隔一段时间(例如一分钟)进行汇总。数据被发送到将其存储在ETS表中的过程中,并且每隔一段时间,计时器就会向其发送一条消息处理表并删除旧数据。

问题在于传入的数据量千差万别,我基本上需要对它做两件事:

  • 如果传入的数据量太大,则丢弃最旧的数据并推送新数据。这可以视为固定大小的队列,如果数据量达到限制,则队列将开始从队列中丢弃数据。新数据排在后面。
  • 如果队列未满,但是数据已经坐在那里一段时间,则自动将其丢弃(在固定的超时后)。

如果保持这两个条件,我基本上可以假设该表的大小恒定,并且其中的所有内容都比X更新。

问题是我还没有找到一种有效的方法来将这两件事合在一起。我知道我可以使用匹配规范来删除所有早于X的整数,如果索引是时间戳记,这应该相当快。尽管我不确定这是否是定期整理桌子的最佳方法。

第二个问题是将表的总大小保持在一定限制内,我不太确定该怎么做。我想到的一种解决方案是使用一个自动增量字段,该字段将在每次插入时使用,并且在修剪表时,查看第一个和最后一个索引,计算差异,然后再次使用匹配规范删除阈值以下的所有内容。

说了这么多之后,感觉到我可能正在将ETS表用于并非旨在做的事情。有没有更好的方法来存储这样的数据,还是我正确地解决了这个问题?

Nat*_*rot 1

我还没有使用 ETS 来做这样的事情,但在其他 NoSQL DB (DynamoDB) 中,一个简单的解决方案是使用多个表:如果您要保留 24 小时的数据,则保留 24 个表,一天中的每一小时一个表。当您想要删除数据时,请删除整个表。