LRU

LRU(Least Recently Used)是一种常见的页面置换算法,在计算中,所有的文件操作都要放在内存中进行,然而计算机内存大小是固定的,所以我们不可能把所有的文件都加载到内存,因此我们需要制定一种策略对加入到内存中的文件进项选择。

常见的页面置换算法有如下几种:

LRU 最近最久未使用
FIFO 先进先出置换算法 类似队列
OPT 最佳置换算法 (理想中存在的)
NRU Clock置换算法
LFU 最少使用置换算法
PBA 页面缓冲算法

LRU原理

LRU的设计原理就是,当数据在最近一段时间经常被访问,那么它在以后也会经常被访问。这就意味着,如果经常访问的数据,我们需要然其能够快速命中,而不常访问的数据,我们在容量超出限制内,要将其淘汰。

import com.google.common.collect.ImmutableList;
 
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
 
public class  LRUSample<K, V> extends LinkedHashMap<K, V> {
 
    public LRUSample(){
        super(16, 0.75f, true);
    }
    //LRU的空间大小
    final int MAX_CACHE = 3;
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        if(size() <= MAX_CACHE){
            return false;
        }else{
            return true;
        }
    }
public static void doHandle(LRUSample<Integer, String> cache){
    }
    public static void main(String[] args) {
        LRUSample<Integer, String> cache = new LRUSample<>();
        //需要调度的顺序
        List<Integer> list = ImmutableList.of(1, 2, 3, 1, 3, 2, 4, 1, 3, 2, 1, 5, 1);
        list.forEach(
                key -> cache.put(key, "value")
        );
        //后输出的是最新访问的
        cache.forEach((key, value) -> System.out.println(key));
        doHandle(cache);
    }
}

个人需要更改的就是main函数中的list,传入具体的访问次序。

这里实现的LRU cache默认3个块,可以修改MAX_CACHE来做到自定义多少个块

最后输出时候,后输出的是最新访问的,如果拿到cache之后要做别的工作,可以加入别的处理函数。

Guava提供了对JDK里标准集合类里的immutable版本的简单方便的实现,以及Guava自己的一些专门集合类的immutable实现。当你不希望修改一个集合类,或者想做一个常量集合类的时候,使用immutable集合类就是一个最佳的编程实践。 

注意:每个Guava immutable集合类的实现都拒绝null值。我们做过对Google内部代码的全面的调查,并且发现只有5%的情况下集合类允许null值,而95%的情况下

都拒绝null值。万一你真的需要能接受null值的集合类,你可以考虑用Collections.unmodifiableXXX。

immutable集合可以有以下几种方式来创建:

  1、用copyOf方法, 譬如, ImmutableSet.copyOf(set)

  2、使用of方法,譬如,ImmutableSet.of("a", "b", "c")或者ImmutableMap.of("a", 1, "b", 2)

  3、使用Builder类