java多线程复习与巩固(六)

手动实现一个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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38700984/article/details/106303786