如何使用 Erlang 实现 LRU 缓存?
最受关注的 Github 项目是 fogfish/cache ,但分段表不太适合我的数据。
barrel-db/erlang-lru正在使用列表。经过测试,数据量太多的话会很慢。
我猜问题出在这里。
move_front(列表, 键) ->
[关键|列表:删除(键,列表)]。
对于Java,更好的实现是使用 HashMap 和链接列表 like this
我尝试做一个链表,然后意识到链表对于Erlang来说不是一个好主意,like this thread .
问题是如何使用 Erlang 进行 LRU 缓存?
最佳答案
THE CACHE 的第一个实现是基于具有两个索引的 ETS。一个ets表保存TTL -> Key
关系,另一个ets表保存Key -> Object
关系。您可以在
https://github.com/fogfish/cache/commit/8cc50bffb4178ad9ad716703507c3290e1f94821
两个索引的维护效率不高,因此分段缓存优于原始实现。我不建议使用 Erlang 数据结构实现每个对象的 TTL,除非您可以在 actor 中对数据进行建模并接受开销。有一个实现可以解决这个问题。它使用每个对象的进程概念:
https://github.com/fogfish/pts
否则,您需要实现 NIF
关于caching - Erlang LRU 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644224/