2016-07-28 134 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