实现带过期时间的LRU:https://blog.csdn.net/weixin_42970433/article/details/107896626
思路:每次添加新结点时,判断Map中是否已有,如果有,移动到队头;没有的话就新建一个结点放入。
package LRU1;
public class Node{
private String key;
private Object value;
public Node(String key, Object value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public Object getValue() {
return value;
}
}
package LRU1;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class LRU {
//用户存储数据,为了保证线程安全,使用ConcurrentHashMap
private ConcurrentHashMap<String,Node> cache=new ConcurrentHashMap<>(1024);
//用于保存数据的链表
private LinkedList<Node> list=new LinkedList<>();
public Object set(String key,Object value){
//新建一个结点
Node newNode=new Node(key,value);
//old是这个key原有的value,返回null则表示原来不存在这个key
Node old=cache.put(key,newNode);
//如果该key存在数据,删除原有结点,将新节点放到队头
if(old!=null){
list.remove(old);
list.addFirst(newNode);
return old.getValue();
}
//没有的话,将新节点放到队头
else{
list.addFirst(newNode);
}
return null;
}
public Object get(String key){
//从cache直接获取
Node n=cache.get(key);
if(n==null)
return null;
else
return n.getValue();
}
}