有关缓存,缓存算法,缓存框架:part 4

 

在这一部分中,我们来看看如何实现这些著名的缓存算法。以下的代码只是示例用的,如果你想自己实现缓存算法,可能自己还得加上一些额外的工作。

LeftOver机制

在 programmer one 阅读了文章之后,他接着看了文章的评论,其中有一篇评论提到了leftover机制——random cache。

Random Cache:

我是随机缓存,我随意的替换缓存实体,没人敢抱怨。你可以说那个被替换的实体很倒霉。通过这些行为,我随意的去处缓存实体。我比FIFO机制好,在某些情况下,我甚至比 LRU 好,但是,通常LRU都会比我好。

现在是评论时间

当programmer one 继续阅读评论的时候,他发现有个评论非常有趣,这个评论实现了一些缓存算法,应该说这个评论做了一个链向评论者网站的链接,programmer one顺着链接到了那个网站,接着阅读。

看看缓存元素(缓存实体)

public class CacheElement {

private Object objectValue;

private Object objectKey;

private int index;

private int hitCount;

// getters and setters

}

这个缓存实体拥有缓存的key和value,这个实体的数据结构会被以下所有缓存算法用到。

缓存算法的公用代码

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

int index;
Object obj;

// get the entry from the table
obj = table.get(key);

// If we have the entry already in our table
then get it and replace only its value.
if (obj != null) {
	CacheElement element;

	element = (CacheElement) obj;
	element.setObjectValue(value);
	element.setObjectKey(key);

	return;
}
}

上面的代码会被所有的缓存算法实现用到。这段代码是用来检查缓存元素是否在缓存中了,如果是,我们就替换它,但是如果我们找不到这个key对应的缓存,我们会怎么做呢?那我们就来深入的看看会发生什么吧!

现场访问

今天的专题很特殊,因为我们有特殊的客人,事实上他们是我们想要听的与会者,但是首先,先介绍一下我们的客人:Random Cache,FIFO Cache。让我们从 Random Cache开始。

看看随机缓存的实现

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

int index;
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 we haven't
filled the cache yet, put it at the end.
if (!isFull()) {
	index = numEntries;
	++numEntries;
} else {
	// Otherwise, replace a random entry.
	index = (int) (cache.length * random.nextFloat());
	table.remove(cache[index].getObjectKey());
}

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

看看FIFO缓存算法的实现

public final synchronized void addElement(Object
key,Object value) {
int index;
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 we haven't filled the cache yet, put it at the end.
if (!isFull()) {
	index = numEntries;
	++numEntries;
} else {
	// Otherwise, replace the current pointer, entry with the new one
	index = current;
	// in order to make Circular FIFO
	if (++current >= cache.length)
		current = 0;

	table.remove(cache[index].getObjectKey());
}

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

结论

这次我们演示了随机缓存和FIFO的代码,下面我们会演示LFU缓存算法和FRU缓存算法。

你可能感兴趣的:(框架,算法,cache,object,null,Random)