-
网站访问速度慢怎么办? 你可能最先想到就是上个缓存,通过缓存减小数据库的访问量
-
为什么需要淘汰策略?
-
但是缓存是存在内存中的,这是一笔很大的开销,,当我们的缓存已经到达上限 此时又添加key时,我们就必须得放弃一个或多个key, 但是我们又得保证缓存命中率,保证放弃的key一定是最少被使用的,我们可以使用lru算法作为淘汰机制.
-
lru ( Least Recently Used ) 最近最少使用
-
如何实现?
-
第一 、在添加缓存时,我们把访问最少使用的key(链表的头节点)给删除,将新key添加到链表尾部
-
第二、 访问缓存时,我们把当前key 移到链表尾部
-
我们可以使用双向链表很方便实现lru
-
代码
public class LruCache {
private static final int MaxCap=10;
private LinkedList<String> lrucache=new LinkedList<String>();
private static final Map<String,String> kvMap=new ConcurrentHashMap<>();
public void Push(String key,String val){
if (lrucache.size()==MaxCap){
//缓存满了,弹出首个元素,首个元素表示最近最少访问的缓存
kvMap.remove(lrucache.getFirst());
lrucache.removeFirst();
}
kvMap.put(key,val);
//加入到尾部
lrucache.addLast(key);
}
public String get(String key){
if (!kvMap.containsKey(key))
return null;
lrucache.remove(key);//先移除
lrucache.addLast(key);//在重新加入到尾部
return kvMap.get(key);
}
public static void main(String[] args) {
LruCache lru = new LruCache();
for (int i=0;i<=20;i++){
lru.Push(String.valueOf(i),String.valueOf(i));
}
System.out.println(lru.get("0")==null);
System.out.println(lru.get("20")==null);
}
}