redis缓存淘汰策略-LRU算法(最近最少使用)
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,
选择最近最久未使用的数据予以淘汰。
1,所谓缓存,
必须要有读+写两个操作,按照命中率的思路考虑,写操作+读操作时间复杂度都需要为O(1)
2,特性要求
2.1必须要有顺序之分,一区分最近使用的和很久没有使用的数据排序。2.2写和读操作一次搞定。
2.3如果容量(坑位)满了要删除最不长用的数据,每次新访问还要把新的数据插入到队头(按照业务你自己设定左右那一边是队头)
查找快、插入快、鹏除快,且还需要先后排序...…>什么样的数据结构可以满足这个问题?
你是否可以在O(1)时间复杂度内完成这两种操作?
如果一次就可以找到,你觉得什么数挑结构最合适??
基于LinkedHashMap实现LRU算法
代码
package lru;
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCacheDemo <k,v> extends LinkedHashMap<k,v> {
private int capacity;
/**
*accessorder thc ordering modc
<tt>true</tt> for access-order,
<tt>false</tt> for insertion-order Cparom capacity
**/
public LRUCacheDemo(int capacity) {
super(capacity,0.75F,true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<k, v> eldest) {
return super.size()>capacity;
//return super.removeEldestEntry(eldest);
}
public static void main(String[] args) {
LRUCacheDemo lrucacheDemo = new LRUCacheDemo(3);
lrucacheDemo.put(1,"a");
lrucacheDemo.put(2,"b");
lrucacheDemo.put(3,"c");
System.out.println(lrucacheDemo.keySet()) ;
// lrucacheDemo.put(4,"d");
}
}
当添加第四个数据进来,这时候就会将1挤出去,淘汰1
不知道前面有一行代码注意没有?
super(capacity,0.75F,false); // true改成了false