LRU:
LinkedHashMap ,
实现思路:HashMap + 双向链表环
按照最近访问/插入顺序,始终保持队列尾部的为最近访问或者最近插入的数据,删除从对头开始!
LinkedHashMap扩展如下方法即可:
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { return false; }
LFU:
实现思路:HashMap + PriorityQueue
下面是个根据Key的自然数据排序的案例(类似,可以把Key包装成一个可排序的包装类型,根据访问次数确定顺序):
import java.util.HashMap; import java.util.PriorityQueue; /** * * @author xinchun.wang * @email: 532002108@qq.com */ public class LFUHashMap<K, V> { private static final int max_size = 10; HashMap<K, V> map = new HashMap<K, V>(); PriorityQueue<Node<K>> tSet = new PriorityQueue<Node<K>>(); @SuppressWarnings("unchecked") public V put(K key, V value) { if (map.size() > max_size) { Node<K> firstKey = (Node<K>) tSet.poll(); map.remove(firstKey.getKey()); } tSet.add(new Node(key, 1)); return map.put(key, value); } public V get(Object key) { V result = map.get(key); incHit(key); return result; } private void incHit(Object key) { for (Object item : tSet) { if (((Node) item).key == key) { ((Node) item).setCount(((Node) item).getCount() + 1); break; } } } @Override public String toString() { return map.toString(); } public static void main(String[] args) { LFUHashMap<Integer, String> lfu = new LFUHashMap<Integer, String>(); for (int i = 0; i < 100; i++) { lfu.put(i, String.valueOf(i) + "_data"); if (i > 5) { lfu.get(1); lfu.get(2); lfu.get(3); lfu.get(4); } if (i > 10) { lfu.get(9); } } while (lfu.tSet.peek() != null) { System.out.println(lfu.tSet.poll()); } System.out.println(lfu); } private static class Node<K> implements Comparable<Node<K>> { private K key; private int count; public Node(K key, int count) { this.key = key; this.count = count; } public K getKey() { return key; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } @Override public String toString() { return "Node [key=" + key + ", count=" + count + "]"; } @Override public int compareTo(Node<K> o) { int diff = this.count - o.count; return diff != 0 ? diff : -((Integer) o.key).compareTo((Integer) this.key); } } }
FIFO:
仿照LinkedHashMap,通过LinkedList 就可以实现FIFO的元素排队
相关推荐
本篇文章将详细介绍三种常见的缓存替换策略:LRU(Least Recently Used)、LFU(Least Frequently Used)和FIFO(First In First Out),并探讨它们在C++中的实现。 首先,LRU缓存策略基于“最近最少使用的”原则。...
本文主要讨论了五种常见的页面替换算法:随机算法(RAND)、先进先出算法(FIFO)、近期最少使用算法(LFU)、最久未使用算法(LRU)以及最优替换算法(OPT)。 1. 随机算法(RAND):这种算法简单易行,通过随机数生成器选择待...
4. 最久没有使用算法(LRU 算法):LRU 算法选择最近最长时间未被访问的页面进行替换,它简化了LFU算法,只需判断页面是否被访问过,实现相对简单,但在某些情况下可能不如LFU准确。 5. 最优替换算法(OPT 算法):...
LRU算法则选择最近最久未被访问的页面进行替换,相对于LFU,LRU简化了实现,只需要记录页面是否被访问过,而不是访问频率。尽管不如LFU精确,但其在大多数情况下能提供良好的性能,并且实现相对简单。 5. 最优替换...
4. 最久未使用算法(LRU算法):选择最近最长时间未被访问的页面替换,简化了LFU算法,仅需记录页面是否被访问过,实现较为简单,效果接近LFU。 5. 最优替换算法(OPT算法):理想的页面替换策略,选择未来最长时间...
常用的 Cache 替换算法有 先进先出(FIFO)、最近最少用(LRU)、最不经常用(LFU)和随机替换算法等。在这些算法中,FIFO 和 LRU 是最常用的两种算法。 FIFO 算法的原理是将最先进入 Cache 的数据淘汰掉。在这种...
LRU算法基于最近最少使用的原理,即认为最近被使用的数据更可能在未来被再次使用。它维护一个数据结构,如链表或哈希表,记录每个页面的最近使用时间。当需要替换页面时,会选择最近最久未使用的页面进行淘汰。然而...
对于CPU缓存这样的高速缓存,LRU(最近最少使用)或LFU(最少频繁使用)等算法可能会提供更好的性能,因为它们考虑了数据访问的局部性和频率。因此,在后续的开发中,可以考虑引入更复杂但效率更高的缓存替换策略,...
2. Cache替换算法:学习并实现不同的替换算法,比如最近最少使用(LRU)、最不常用(LFU)或随机替换,分析其性能差异。 3. 写操作处理:学习写直达、写回和写无效策略,理解它们对Cache命中率的影响。 4. 命中率...
2. FIFO(先进先出):按照数据块进入Cache的顺序进行替换,简单易实现,但可能不适应所有数据访问模式。 3. LFU(最不经常使用):替换使用频率最低的数据块,需要维护使用计数,对硬件资源要求较高。 4. Random...
- 使用 `collections.OrderedDict` 可以轻松实现 LRU 算法,因为该数据结构能记住元素的插入顺序,并且支持快速地移动元素到队尾或队首。 **示例代码**: ```python from collections import OrderedDict class ...
特别探讨分布式缓存的三大经典算法(LRU, LFU, FIFO),并给出具体实现案例——使用LinkedHashMap实现LRU缓存。接着,文章详细阐述常见的分布式缓存问题,如缓存穿透、雪崩和击穿,并提供详细的解决方案和技术手段。...
Clock Cache算法是一种早期的缓存替换策略,它改进了FIFO策略。在Clock算法中,缓存中的块(也称为行或帧)被组织成一个环形结构,每个块有一个状态位(如:Valid、Dirty等)。一个指针(称为Clock Hand)遍历这个环...
自适应替换策略是一种混合策略,结合了LRU和LFU(最不常用)的优点,能够根据实际使用情况动态调整,提高Cache的效率。 综上所述,理解并优化Cache的存储结构对于提升计算机系统的整体性能具有重要意义。设计高效...
- 分析不同的替换算法(如LRU与随机法)对Cache性能的具体影响。 #### 二、实践平台与工具 - **实践平台**:使用名为MyCache的Cache模拟器进行实践。 - **MyCache模拟器使用方法**: - 启动:双击运行MyCache....
2. 不命中时如何替换 Cache 内容:如何选择合适的替换算法,以便在不命中时快速地替换 Cache 内容。 3. Cache 与主存的一致性更新:如何保持 Cache 和主存的一致性,确保数据的一致性。 解决方案 对于主存—Cache ...
在传统的缓存替换算法中,有LRU(Least Recently Used)、LFU(Least Frequently Used)、FIFO(First In First Out)等常见策略。LRU根据最近使用频率来决定替换哪个数据块,LFU则依据数据块的历史访问频率,而FIFO...
实验体会部分,王晨阳可能分享了自己对LRU算法的理解,以及通过实践感受到的LRU与其他近似算法(如FIFO、LFU等)的差异,同时也可能深入理解了虚拟内存的概念,例如页面替换的必要性、内存管理的策略选择等。...
- 替换算法如OPT(最佳)、FIFO(简单但可能导致抖动)、LRU(根据使用频率)和LFU(考虑访问次数),LFU在实际应用中可能存在优化问题。 这些知识点构成了计算机系统中数据存储和访问的基础,理解和掌握它们对于...