caching - Erlang LRU 缓存

标签 caching erlang lru

如何使用 Erlang 实现 LRU 缓存?

LRU Cache Wiki

最受关注的 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/

相关文章:

erlang - channel 上的持久消息

python - Web API 客户端包装器的缓存算法

c# - 将 View 渲染为字符串缓存问题

javascript - 重写 Backbone 的 URL 函数以从本地存储中获取数据

ssl - 负载测试 xmpp 服务器

authentication - 如何在 Elixir 中的进程之间建立经过身份验证的链接?

java - 如何在 Java 中缓存具有可变参数 (Varargs) 的函数的结果

C# 缓存过期不起作用

c# - LRU页面置换算法C#

c++ - 如何 LRU 缓存大量由 C++ STL 重型结构构成的对象?