参考:http://www.cnblogs.com/lzrabbit/p/3734850.html
LRU 缓存实现(Java)
� LRU Cache 的 LinkedHashMap 实现
� LRU Cache 的链表+HashMap 实现
� LinkedHashMap 的 FIFO 实现
� 调用示例
LRU 是 Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU 缓存就是使用
这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据
删除掉,比如我们缓存 10000 条数据,当数据小于 10000 时可以随意添加,当超过 10000
时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存 10000 条,
那怎么确定删除哪条过期数据呢,采用 LRU 算法实现的话就是将最老的最少使用的数据删
掉,废话不多说,下面来说下 Java 版的 LRU 缓存实现
Java 里面实现 LRU 缓存通常有两种选择,一种是使用 LinkedHashMap,一种是自己设
计数据结构,使用链表+HashMap
LRU Cache 的 LinkedHashMap 实现
LinkedHashMap 自身已经实现了顺序存储,默认情况下是按照元素的添加顺序存储,也
可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,
然后它还有一个判断是否删除最老数据的方法,默认是返回 false,即不删除数据,我们使
用 LinkedHashMap 实现 LRU 缓存的方法就是对 LinkedHashMap 实现简单的扩展,扩
展方式有两种,一种是 inheritance,一种是 delegation,具体使用什么方式看个人喜好
//LinkedHashMap 的一个构造函数,当参数 accessOrder 为 true 时,即会按照
访问顺序排序,最近访问的放在最前,最早访问的放在后面
public LinkedHashMap(int initialCapacity, float loadFactor, boolean
accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
//LinkedHashMap 自带的判断是否删除最老的元素方法,默认返回 false,即不
删除老数据
//我们要做的就是重写这个方法,当满足一定条件时删除老数据
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return false;
}
LRU 缓存 LinkedHashMap(inheritance)实现