7

我正在考虑使用 Erlang 的 ETS 作为新 Elixir 项目中用户搜索的缓存。根据用户输入,系统将使用昂贵的第三方 API 进行查找。

为了避免对相同的用户输入进行重复调用,我打算在外部 API 前面放置一个缓存层,ETS 似乎是一个不错的选择。但是,由于用户输入的变化没有限制,我担心 ETS 表所需的存储空间会无限增长。

在我阅读 ETS 时,我还没有看到其他人讨论过对 ETS 中表格大小的担忧。那是因为这对于 ETS 来说是一个不正常的用例吗?

乍一看,我的偏好是限制 ETS 表中的条目数量,并在达到限制后拒绝(即删除)最旧的条目......</p>

是否有处理 ETS 中无限数量的条目的通用策略?

4

2 回答 2

2

我在生产中使用 ETS 表,例如带有 redis API 的“智能无效缓存”(它也具有主-主复制,如 SQL WAL 日志)。

最大的大小约为 200-300Mb,它们有超过 100 万个项目。过去2年没有任何问题。我知道限制ERL_MAX_ETS_TABLES,但没有任何关于尺寸的信息。

我有这个表的特殊“智能索引”。ETS select/match/etc 很慢,因为此方法传递了表中的所有元素。

于 2016-08-24T10:07:26.410 回答
0

使用该ets:tab2list(TableId)函数将 ETS 表转换为通用列表。之后,您可以使用众所周知的 BIF 检查列表的大小length(List)。最后但同样重要的是,您现在可以设置缓冲区(只需使用模式匹配ifcase表达式检查列表的大小

于 2016-08-30T20:30:25.300 回答