caching - LRU 和 LFU 有什么区别

标签 caching linkedhashmap lru

LRULFU 缓存实现有什么区别?

我知道LRU可以使用LinkedHashMap来实现。 但如何实现LFU缓存呢?

最佳答案

让我们考虑缓存容量为 3 的恒定缓存请求流,如下所示:

A, B, C, A, A, A, A, A, A, A, A, A, A, A, B, C, D

如果我们只考虑使用 HashMap + 双向链表实现的最近最少使用 (LRU) 缓存,且具有 O(1) 驱逐时间和 O(1) 加载时间,我们将得到以下结果如上所述,在处理缓存请求时缓存的元素。

[A]
[A, B]
[A, B, C]
[B, C, A] <- a stream of As keeps A at the head of the list.
[C, A, B]
[A, B, C]
[B, C, D] <- here, we evict A, we can do better! 

当您查看这个示例时,您可以很容易地看到我们可以做得更好 - 考虑到将来请求 A 的预期机会更高,我们不应该驱逐它,即使它最近最少使用。

A - 12
B - 2
C - 2
D - 1

最不频繁使用 (LFU) 缓存通过跟踪缓存请求在其逐出算法中使用的次数来利用此信息。

关于caching - LRU 和 LFU 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759560/

相关文章:

java - 将两个 LinkedHashMap 与值作为列表进行比较

java - 如何将 ArrayList<LinkedHashMap<String, Comparable>> 转换为 Comparable?

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

java - LinkedHashMap LRU 缓存 - 确定删除了哪些值?

django - 在 memcached 过期场景中避免 dog-piling 或 thundering herd

asp.net - 如何缓存 IQueryable 对象?

javascript - 如何告诉 Chrome 清除网站的缓存和 cookie?

hibernate - Hibernate 2级缓存不适用于GORM 6.1.11

java - 等效于 LinkedHashMap 在 php 中?

c++ - LRU缓存设计