`
lengrenhanbing
  • 浏览: 46466 次
  • 性别: Icon_minigender_1
  • 来自: 泰安
社区版块
存档分类
最新评论

有关缓存,缓存算法,缓存框架:part 5 [转]

 
阅读更多

上一节中我们实现了随机缓存算法和FIFO缓存算法。现在,我们会继续实现另外两个著名的缓存算法:LFU和LRU。再一次说明,这些代码只是作为演示使用,如果你想在应用程序中使用,你还需要加上额外的工作。

看看LFU缓存算法的实现

public synchronized Object getElement(Object key) {

Object obj;

obj = table.get(key);

if (obj != null) {
	CacheElement element = (CacheElement) obj;
	element.setHitCount(element.getHitCount() + 1);
	return element.getObjectValue();
}
	return null;

}

public final synchronized void addElement(Object key, Object value) {

Object obj;

obj = table.get(key);

if (obj != null) {
	CacheElement element;

	// Just replace the value.
	element = (CacheElement) obj;
	element.setObjectValue(value);
	element.setObjectKey(key);

	return;
}

if (!isFull()) {

	index = numEntries;
	++numEntries;
} else {
	CacheElement element = removeLfuElement();
	index = element.getIndex();
	table.remove(element.getObjectKey());
}

	cache[index].setObjectValue(value);
	cache[index].setObjectKey(key);
	cache[index].setIndex(index);
	table.put(key, cache[index]);
}

public CacheElement removeLfuElement() {

	CacheElement[] elements = getElementsFromTable();
	CacheElement leastElement = leastHit(elements);
	return leastElement;
}

public static CacheElement leastHit(CacheElement[] elements) {

	CacheElement lowestElement = null;
	for (int i = 0; i < elements.length; i++) {
		CacheElement element = elements[i];
		if (lowestElement == null) {
			lowestElement = element;

		} else {
			if (element.getHitCount() < lowestElement.getHitCount()) {
				lowestElement = element;
			}
		}
	}
	return lowestElement;
}

最重点的代码,就应该是 leastHit 这个方法,这段代码就是把 hitCount 最低的元素找出来,然后删除,给新进的缓存元素留位置。

看看LRU缓存算法实现

private void moveToFront(int index) {
int nextIndex, prevIndex;

if(head != index) {
	nextIndex = next[index];
	prevIndex = prev[index];

	// Only the head has a prev entry that is an invalid index so
	// we don't check.
	next[prevIndex] = nextIndex;

	// Make sure index is valid. If it isn't, we're at the tail
	// and don't set prev[next].
	if(nextIndex >= 0)
		prev[nextIndex] = prevIndex;
	else
		tail = prevIndex;

	prev[index] = -1;
	next[index] = head;
	prev[head] = index;
	head = index;
}
}

public final synchronized void addElement(Object key, Object value) {
int index;
Object obj;

obj = table.get(key);

if(obj != null) {
	CacheElement entry;

	// Just replace the value, but move it to the front.
	entry = (CacheElement)obj;
	entry.setObjectValue(value);
	entry.setObjectKey(key);

	moveToFront(entry.getIndex());

	return;
}

// If we haven't filled the cache yet, place in next available spot
// and move to front.
if(!isFull()) {
	if(_numEntries > 0) {
		prev[_numEntries] = tail;
		next[_numEntries] = -1;
		moveToFront(numEntries);
	}
	++numEntries;
} else {
	// We replace the tail of the list.
	table.remove(cache[tail].getObjectKey());
	moveToFront(tail);
}

cache[head].setObjectValue(value);
cache[head].setObjectKey(key);
table.put(key, cache[head]);
}

这段代码的逻辑如 LRU算法 的描述一样,把再次用到的缓存提取到最前面,而每次删除的都是最后面的元素。

结论

我们已经看到 LFU缓存算法 和 LRU缓存算法的实现方式,至于如何实现,采用数组还是 LinkedHashMap,都由你决定,不够我一般是小的缓存容量用数组,大的用LinkedHashMap。

在下面一节中,我们将扯扯缓存框架,他们使用的缓存算法,并且做一些比较。


分享到:
评论

相关推荐

    算法导论(part1)

    目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等...

    算法导论(part2)

    目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等...

    TCP-IP详解卷二:实现part2

    目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 源代码表示 1 1.2.1 将拥塞窗口设置为1 1 ...16.11.5 接收缓存的组织:没有报文边界 408 16.11.6 控制信息和带外数据 409 16.12 soreceive代码 410 16.13 select系统...

    TCP-IP详解卷二:实现part1

    目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 源代码表示 1 1.2.1 将拥塞窗口设置为1 1 ...16.11.5 接收缓存的组织:没有报文边界 408 16.11.6 控制信息和带外数据 409 16.12 soreceive代码 410 16.13 select系统...

    TCP-IP详解卷2:实现.part1

    《TCP-IP详解》共3卷,其他卷请到我空间下载,第2卷共分两个part,请下载完两个part后在解压。本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法...

    TCP-IP详解卷2:实现.part2

    《TCP-IP详解》共3卷,其他卷请到我空间下载,第2卷共分两个part,请下载完两个part后在解压。本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法...

    代码优化:有效使用内存.part3

    2.7.18块处理算法的优化 2.7.19大型数组排序的优化 2.8RAM测试问题 第3章高速缓存子系统 3.1SRAM的工作原理 3.1.1历史概况 3.1.2内核 3.1.3触发器的设计 3.1.4逻辑非元件(取反器)的设计 3.1.5SRAM阵列的设计 3.1.6...

    代码优化:有效使用内存.part2

    2.7.18块处理算法的优化 2.7.19大型数组排序的优化 2.8RAM测试问题 第3章高速缓存子系统 3.1SRAM的工作原理 3.1.1历史概况 3.1.2内核 3.1.3触发器的设计 3.1.4逻辑非元件(取反器)的设计 3.1.5SRAM阵列的设计 3.1.6...

    代码优化:有效使用内存.part1

    2.7.18块处理算法的优化 2.7.19大型数组排序的优化 2.8RAM测试问题 第3章高速缓存子系统 3.1SRAM的工作原理 3.1.1历史概况 3.1.2内核 3.1.3触发器的设计 3.1.4逻辑非元件(取反器)的设计 3.1.5SRAM阵列的设计 3.1.6...

    程序员面试攻略 part1(共2个)

    10.17 面试例题:高速磁盘缓存177 10.18 面试例题:数据库的优点178 10.19 面试例题:加密技术178 10.20 面试例题:新的加密算法179 10.21 面试例题:哈希表与二元搜索树1 7 9 第11章非技术问题181 11.1 答题...

    程序员面试攻略part 2(共2个)

    10.17 面试例题:高速磁盘缓存177 10.18 面试例题:数据库的优点178 10.19 面试例题:加密技术178 10.20 面试例题:新的加密算法179 10.21 面试例题:哈希表与二元搜索树1 7 9 第11章非技术问题181 11.1 答题...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    1.1.5 要点5:ASP.NET是面向对象的 1.1.6 要点6:ASP.NET支持所有的浏览器 1.1.7 要点7:ASP.NET易于部署和配置 1.2 ASP.NET的演变 1.2.1 ASP.NET1.0和ASP.NET1.1 1.2.2 ASP.NET2.0 1.2.3 ASP.NET3.5 ...

    深入解析Windows操作系统中文.part2.rar

    阶段5:启动初始线程的执行 310 阶段6:在新进程环境下执行进程初始化 310 6.3 线程的内部机理 313 数据结构 313 内核变量 320 性能计数器 321 有关的函数 322 一个线程的产生 322 6.4 检查线程活动 323 6.5 线程...

    TCP/IP详解part_2

    1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 ...

    3D游戏编程大师技巧(中).part2.rar

    本书是游戏编程畅销书作者André...第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。

    3D游戏编程大师技巧(中).part1.rar

    本书是游戏编程畅销书作者André...第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。

    3D游戏编程大师技巧.part2

    第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。 本书适合于有一定编程经验并想...

    TCPIP详解卷[1].part04

    1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 ...

Global site tag (gtag.js) - Google Analytics