【发布时间】:2016-07-28 18:33:36
【问题描述】:
如何用 Erlang 实现 LRU Cache?
星号最高的 Github 项目是 fogfish/cache,但分段表不太适合我的数据。
barrel-db/erlang-lru 正在使用列表。经过测试,如果数据太多会很慢。
我猜问题出在这里。
move_front(List, Key) ->
[Key | lists:delete(Key, List)].
对于 Java,更好的实现是使用 hashmap 和 linkedlist like this
我尝试做一个链表,然后意识到 链表对于 Erlang 来说不是个好主意,like this thread。
问题是如何用 Erlang 做 LRU 缓存?
【问题讨论】:
-
我认为 Erlang 的级别太高了,不适合做低级缓存,目前,Erlang 在核心中有一些类似的特性(比如 ETS erlang.org/doc/man/ets.html),所以,你在使用外部之前测试了其中的一些特性吗?项目?
-
@MathieuK。谢谢你的cmets。是的,我试过了。关键问题是LRU。我尝试使用表来保存 access_time,但是对于每次读取/更新,我都需要更新(删除然后插入)表。我想知道这是否可以用更好的方法来完成?
-
我对你的问题没有一个答案。如果你想在 Erlang 中实现高性能的 LRU 缓存,我想最好的方法之一是使用与 ports 或 NIF 互连的外部代码。 C 编程不是我最喜欢的领域,但是,如果你想要一些为 Erlang 实现 C 代码的示例,你可以查看beam source code。