手动实现一个LUR
LRU全称是Least Recently Used,即最近最久未使用的意思
package com.gooagoo.market.common.util;
import java.util.PriorityQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* Created by zhangkun on 2020/5/23.
*/
public class LUR {
private static ScheduledExecutorService scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(10);
private static ConcurrentHashMap<String,Node> cache = new ConcurrentHashMap<>(1024);
private static PriorityQueue<Node> expireQueue = new PriorityQueue(1024);
public LUR(){
scheduledThreadPoolExecutor.scheduleWithFixedDelay(new ExpireNode(),3,3, TimeUnit.SECONDS);
}
public class ExpireNode implements Runnable{
@Override
public void run() {
//获取当前时间
long curTime= System.currentTimeMillis();
while(true){
Node node = expireQueue.peek();
// 队列获取头部元素 为空 或者不过期则返回
if(node == null||node.getExpireTime()>curTime){
return;
}
// 过期则从缓存中删除 并且从队列中弹出
cache.remove(node.getKey());
expireQueue.poll();
}
}
}
public Object set(String key,Object value,long ttl){
//获取过期时间点
long expireTime = System.currentTimeMillis()+ttl;
Node newNode = new Node(key,value,expireTime);
Node oldNode = cache.get(key);
//cache 有的话就覆盖 没有的话就添加新的
cache.put(key,newNode);
expireQueue.offer(newNode);
if(oldNode!=null){
expireQueue.remove(oldNode);
return oldNode.getValue();
}
return null;
}
public Object get(String key){
Node node = cache.get(key);
if(node!=null){
return node.getValue();
}
return null;
}
}
package com.gooagoo.market.common.util;
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
/**
* Created by zhangkun on 2020/5/23.
*/
public class Node implements Comparable<Node> {
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public long getExpireTime() {
return expireTime;
}
public void setExpireTime(long expireTime) {
this.expireTime = expireTime;
}
private String key;
private Object value;
private long expireTime;
public Node(String key,Object value,long expireTime) {
this.key = key;
this.value = value;
this.expireTime = expireTime;
}
@Override
public int compareTo(Node o) {
long time = this.expireTime - o.expireTime;
if(time>0){
return 1;
}
if(time<0){
return -1;
}
return 0;
}
}