2016-07-28 151 views
3

如何使用Erlang实现LRU缓存?Erlang LRU缓存

LRU Cache Wiki

顶部出演Github的项目是fogfish/cache,但分段表是不是很适合我的数据。

barrel-db/erlang-lru正在使用列表。经过测试,如果数据太多,速度会很慢。

我猜问题就在这里。

move_front(List, Key) -> [Key | lists:delete(Key, List)].

随着的Java,更好的实施方案是使用的HashMap链表like this

我试图做一个链表,然后意识到LinkedList的是不是好主意对于Erlang,like this thread

问题是如何用Erlang做一个LRU缓存?

+0

我认为Erlang是做低级别缓存和过高的水平目前,二郎在核心一些类似的功能(像ETS http://erlang.org/doc/man/ets.html),那么,在使用外部项目之前,您是否测试了其中一些功能? –

+0

@MathieuK。感谢您的意见。是的,我试过了。关键问题是LRU。我尝试使用表来保存access_time,但是对于每次读取/更新,我需要更新(删除然后插入)表。我想知道这是否可以用更好的方法完成? – user3644708

+0

我没有你的问题的一个答案。如果你想在Erlang中实现高性能的LRU缓存,我想最好的方法之一是使用与[ports](http://erlang.org/doc/reference_manual/ports.html)或[NIF]互连的外部代码( http://erlang.org/doc/tutorial/nif.html)。 C编程不是我最喜欢的领域,但是,如果你想要一些为Erlang实现C代码的例子,你可以检查[beam source code](https://github.com/erlang/otp/tree/maint/erts/)仿真器/波束)。 –

回答

1

THE CACHE的第一个实现基于ETS和两个索引。一个ets表持有TTL -> Key关系,另一个ets表是Key -> Object。你可以看到在

https://github.com/fogfish/cache/commit/8cc50bffb4178ad9ad716703507c3290e1f94821

实施两只指数的维护效率不高从而分段缓存跑赢原来的执行。我不建议使用Erlang数据结构来实现每个对象的TTL,除非你可以在角色中建模数据并接受开销。有一个实现来解决它。它是采用每个对象的概念的过程:

https://github.com/fogfish/pts

否则,您需要实现NIF