import java.util.Arrays;
public class Cache {
// 缓存的大小
private static final int SIZE = 5;
// 缓存空间
private final int[] cacheCells = new int[SIZE];
// 每个缓存槽中数据的年龄
private final int[] cellAge = new int[SIZE];
// 核心方法,从缓存中获取
public int getFromCache(int n){
// 遍历缓存,寻找n
for(int i = 0; i< SIZE; i++){
// 如果找到n,则返回,并且刷新每个槽的年龄
if (cacheCells[i] == n){
flushAge(i);
return cacheCells[i];
}
// 如果在缓存中找到第一个空的槽,则未命中(假设0表示空,且缓存顺序存入数据)
if (cacheCells[i] == 0){
int storageN = getFromStorage(n);
cacheCells[i] = storageN;
flushAge(i);
return storageN;
}
}
// 缓存未命中,且缓存已满,需执行删除策略
int index = deleteURL();
int storageN = getFromStorage(n);
cacheCells[index] = storageN;
flushAge(index);
return storageN;
}
protected int getFromStorage(int n){
return n;
}
private void flushAge(int index){
for (int i = 0; i< SIZE;i++){
if (i != index){
cellAge[i] = cellAge[i]+1;
} else {
cellAge[i] = 0;
}
}
}
private int deleteURL(){
// 找打年龄最大的缓存槽,并返回其索引编号
int maxAge = Integer.MIN_VALUE;
int index = 0;
for (int i = 0; i< SIZE;i++){
if (cellAge[i] > maxAge){
index = i;
maxAge = cellAge[i];
}
}
return index;
}
// 用于测试
public void showCacheStatus(){
System.out.println(Arrays.toString(cacheCells));
System.out.println(Arrays.toString(cellAge));
}
}
网友评论