`

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调度算法.docx

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

    cache调度算法 (2).docx

    为了改进FIFO算法的不足,近期最少使用算法(LFU算法)被提出。LFU算法通过记录每个页面的访问频率来决定替换目标,优先淘汰访问次数最少的页面。LFU算法较为合理地反映了页面的实际使用情况,但其算法复杂度较高,...

    cache调度算法 (2).pdf

    根据不同的设计思路,页面替换算法可以分为多种,其中包括随机算法(RAND)、先进先出算法(FIFO)、近期最少使用算法(LFU)、最久未使用算法(LRU)以及最优替换算法(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 ...

    深入浅出解析分布式缓存关键技术与实战指南

    特别探讨分布式缓存的三大经典算法(LRU, LFU, FIFO),并给出具体实现案例——使用LinkedHashMap实现LRU缓存。接着,文章详细阐述常见的分布式缓存问题,如缓存穿透、雪崩和击穿,并提供详细的解决方案和技术手段。...

    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在实际应用中可能存在优化问题。 这些知识点构成了计算机系统中数据存储和访问的基础,理解和掌握它们对于...

Global site tag (gtag.js) - Google Analytics