`

cache 清除算法 LRU & LFU & FIFO

 
阅读更多

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,LFU,FIFO缓存C ++实现

    本篇文章将详细介绍三种常见的缓存替换策略:LRU(Least Recently Used)、LFU(Least Frequently Used)和FIFO(First In First Out),并探讨它们在C++中的实现。 首先,LRU缓存策略基于“最近最少使用的”原则。...

    cache调度算法.pdf

    本文主要讨论了五种常见的页面替换算法:随机算法(RAND)、先进先出算法(FIFO)、近期最少使用算法(LFU)、最久未使用算法(LRU)以及最优替换算法(OPT)。 1. 随机算法(RAND):这种算法简单易行,通过随机数生成器选择待...

    cache调度算法 (2).docx

    4. 最久没有使用算法(LRU 算法):LRU 算法选择最近最长时间未被访问的页面进行替换,它简化了LFU算法,只需判断页面是否被访问过,实现相对简单,但在某些情况下可能不如LFU准确。 5. 最优替换算法(OPT 算法):...

    cache调度算法.docx

    LRU算法则选择最近最久未被访问的页面进行替换,相对于LFU,LRU简化了实现,只需要记录页面是否被访问过,而不是访问频率。尽管不如LFU精确,但其在大多数情况下能提供良好的性能,并且实现相对简单。 5. 最优替换...

    cache调度算法 (2).pdf

    4. 最久未使用算法(LRU算法):选择最近最长时间未被访问的页面替换,简化了LFU算法,仅需记录页面是否被访问过,实现较为简单,效果接近LFU。 5. 最优替换算法(OPT算法):理想的页面替换策略,选择未来最长时间...

    (5)--课件PPT1

    常用的 Cache 替换算法有 先进先出(FIFO)、最近最少用(LRU)、最不经常用(LFU)和随机替换算法等。在这些算法中,FIFO 和 LRU 是最常用的两种算法。 FIFO 算法的原理是将最先进入 Cache 的数据淘汰掉。在这种...

    内存替换算法各个算法对比

    LRU算法基于最近最少使用的原理,即认为最近被使用的数据更可能在未来被再次使用。它维护一个数据结构,如链表或哈希表,记录每个页面的最近使用时间。当需要替换页面时,会选择最近最久未使用的页面进行淘汰。然而...

    先进先出缓存算法

    对于CPU缓存这样的高速缓存,LRU(最近最少使用)或LFU(最少频繁使用)等算法可能会提供更好的性能,因为它们考虑了数据访问的局部性和频率。因此,在后续的开发中,可以考虑引入更复杂但效率更高的缓存替换策略,...

    系统结构实验(模拟主存-cache、主存-辅存)

    2. Cache替换算法:学习并实现不同的替换算法,比如最近最少使用(LRU)、最不常用(LFU)或随机替换,分析其性能差异。 3. 写操作处理:学习写直达、写回和写无效策略,理解它们对Cache命中率的影响。 4. 命中率...

    Cache存储器系统地址映象及替换算法的简单动态演示程序VC源码

    2. FIFO(先进先出):按照数据块进入Cache的顺序进行替换,简单易实现,但可能不适应所有数据访问模式。 3. LFU(最不经常使用):替换使用频率最低的数据块,需要维护使用计数,对硬件资源要求较高。 4. Random...

    Python· 页面置换算法.docx

    - 使用 `collections.OrderedDict` 可以轻松实现 LRU 算法,因为该数据结构能记住元素的插入顺序,并且支持快速地移动元素到队尾或队首。 **示例代码**: ```python from collections import OrderedDict class ...

    CacheSimulator_summerlqi_java_clock_cache_

    Clock Cache算法是一种早期的缓存替换策略,它改进了FIFO策略。在Clock算法中,缓存中的块(也称为行或帧)被组织成一个环形结构,每个块有一个状态位(如:Valid、Dirty等)。一个指针(称为Clock Hand)遍历这个环...

    Cache的存储结构

    自适应替换策略是一种混合策略,结合了LRU和LFU(最不常用)的优点,能够根据实际使用情况动态调整,提高Cache的效率。 综上所述,理解并优化Cache的存储结构对于提升计算机系统的整体性能具有重要意义。设计高效...

    Cache性能分析1.5.docx

    - 分析不同的替换算法(如LRU与随机法)对Cache性能的具体影响。 #### 二、实践平台与工具 - **实践平台**:使用名为MyCache的Cache模拟器进行实践。 - **MyCache模拟器使用方法**: - 启动:双击运行MyCache....

    cache工作原理

    2. 不命中时如何替换 Cache 内容:如何选择合适的替换算法,以便在不命中时快速地替换 Cache 内容。 3. Cache 与主存的一致性更新:如何保持 Cache 和主存的一致性,确保数据的一致性。 解决方案 对于主存—Cache ...

    ReD_redcache_替换算法代码_

    在传统的缓存替换算法中,有LRU(Least Recently Used)、LFU(Least Frequently Used)、FIFO(First In First Out)等常见策略。LRU根据最近使用频率来决定替换哪个数据块,LFU则依据数据块的历史访问频率,而FIFO...

    57119101_王晨阳_LRU1

    实验体会部分,王晨阳可能分享了自己对LRU算法的理解,以及通过实践感受到的LRU与其他近似算法(如FIFO、LFU等)的差异,同时也可能深入理解了虚拟内存的概念,例如页面替换的必要性、内存管理的策略选择等。...

    计算机组成原理~第三章1

    - 替换算法如OPT(最佳)、FIFO(简单但可能导致抖动)、LRU(根据使用频率)和LFU(考虑访问次数),LFU在实际应用中可能存在优化问题。 这些知识点构成了计算机系统中数据存储和访问的基础,理解和掌握它们对于...

    全国计算机技术与软件专业技术资格水平考试全真模拟试卷一上午试题.pdf

    9. **页面置换算法**:在操作系统中,页面置换算法有多种,如最近最久未使用(LRU)、最少使用(LFU)、先进先出(FIFO)等。这些算法用于决定何时和如何替换内存中的页面。 10. **请求分页系统**:在请求分页系统...

Global site tag (gtag.js) - Google Analytics