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;
    }
}
相关推荐
SimpleLearingAI5 分钟前
聚类算法详解
算法·数据挖掘·聚类
多加点辣也没关系1 小时前
Redis 的安装(详细教程)
数据库·redis·缓存
刀法如飞1 小时前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员
好家伙VCC1 小时前
【无标题】
java
数据库小学妹1 小时前
数据库连接池避坑指南:告别“连接超时”与“资源耗尽”,让系统跑得更快!
数据库·redis·sql·mysql·缓存·dba
小碗羊肉2 小时前
【JavaWeb | 第十一篇】文件上传(本地&阿里云OSS)
java·阿里云·servlet
吾疾唯君医2 小时前
Java SpringBoot集成积木报表实操记录
java·spring boot·spring·导出excel·积木报表·数据文件下载
難釋懷2 小时前
Redis网络模型-IO多路复用模型-poll模式
网络·数据库·redis
Byron Loong2 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
Dlrb12113 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针