LRU缓存

LRU缓存(Least Recently Used,最近最少使用)是一种数据缓存机制,旨在解决计算机内存中数据的替换问题。当缓存空间不足时,LRU缓存会淘汰最近最久未被使用的数据,以确保缓存中始终存储着最新和最频繁使用的数据。

java 复制代码
class LRUCache {
class Node{
    int key,val;
    Node pre,next;
    public Node(){}
    public Node(int key,int val){
        this.key = key;
        this.val = val;
    }
}
private ConcurrentHashMap<Integer,Node> cache = new ConcurrentHashMap<>();
private int size;
private int capacity;
private Node head = new Node();
private Node tail = new Node();
    public LRUCache(int capacity) {
        this.capacity = capacity;
        size = 0;
        head.next = tail;
        tail.pre = head;
    }
    
    public int get(int key) {
        Node node = cache.get(key);
        if(node == null)
            return -1;
        moveToHead(node);
        return node.val;
    }
    
    public void put(int key, int value) {
        Node node = cache.get(key);
        if(node != null){
            node.val = value;
            moveToHead(node);
        }else{
            Node newNode = new Node(key,value);
            cache.put(key,newNode);
            addToHead(newNode);
            ++size;
            if(size > capacity){
                Node removeNode = removeTail();
                cache.remove(removeNode.key);
                --size;
            }
        }
    }
    public void moveToHead(Node node){
        removeNode(node);
        addToHead(node);
    }
    public void removeNode(Node node){
        node.pre.next = node.next;
        node.next.pre = node.pre;
    }
    public void addToHead(Node node){
        node.pre = head;
        node.next  = head.next;
        head.next.pre = node;
        head.next = node;
    }
    public Node removeTail(){
        Node removeNode = tail.pre;
        removeNode(removeNode);
        return removeNode;
    }
}
相关推荐
华仔啊16 分钟前
主线程存了用户信息,子线程居然拿不到?ThreadLocal 背锅
java·后端
间彧27 分钟前
Spring Boot项目中,Redis 如何同时执行多条命令
java·redis
召摇1 小时前
如何避免写垃圾代码:Java篇
java·后端·代码规范
vker1 小时前
第 1 天:单例模式(Singleton Pattern)—— 创建型模式
java·设计模式
我不是混子1 小时前
什么是内存泄漏?
java
程序员小假1 小时前
我们来说说当一个线程两次调用 start() 方法会出现什么情况?
java·后端
SimonKing2 小时前
Archery:开源、一站式的数据库 SQL 审核与运维平台
java·后端·程序员
Seven973 小时前
Redis常见性能问题
redis
皮皮林55113 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
卡尔特斯17 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin