首页 > 其他分享 >LRU缓存

LRU缓存

时间:2023-08-22 23:11:16浏览次数:27  
标签:缓存 capacity int LRU key null 节点 LinkedHashMap

LRU缓存主要是讲的LinkedHashMap的实现
LinkedHashMap的构造函数

//主要有三个参数:初始容量、负载因子、是否以访问顺序(默认是false)
public LinkedHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        accessOrder = false;
    }

    /**
     * Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
     * with the specified initial capacity and a default load factor (0.75).
     *
     * @param  initialCapacity the initial capacity
     * @throws IllegalArgumentException if the initial capacity is negative
     */
    public LinkedHashMap(int initialCapacity) {
        super(initialCapacity);
        accessOrder = false;
    }

    /**
     * Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
     * with the default initial capacity (16) and load factor (0.75).
     */
    public LinkedHashMap() {
        super();
        accessOrder = false;
    }

这个类奇特在插入、删除、访问节点会调用三个对应的方法

// 删除节点时调用
/**
 * 首先会断开要删除节点的前后节点,然后如果删除的是第一个节点,就让后一个节点变为头节点
 * 否则让第一个节点的after等于下一个节点
 * 如果后一个节点为空,那么尾节点就变成了前一个节点
 * 否则就后一个的before为前一个节点
 */
 
void afterNodeRemoval(Node<K,V> e) { // unlink
        LinkedHashMap.Entry<K,V> p =
            (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
        p.before = p.after = null;
        if (b == null)
            head = a;
        else
            b.after = a;
        if (a == null)
            tail = b;
        else
            a.before = b;
    }
	
// 插入时调用
    void afterNodeInsertion(boolean evict) { // possibly remove eldest
        LinkedHashMap.Entry<K,V> first;
        if (evict && (first = head) != null && removeEldestEntry(first)) {
            K key = first.key;
            removeNode(hash(key), key, null, false, true);
        }
    }

// 访问时调用
    void afterNodeAccess(Node<K,V> e) { // move node to last
        LinkedHashMap.Entry<K,V> last;
        if (accessOrder && (last = tail) != e) {
            LinkedHashMap.Entry<K,V> p =
                (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
            p.after = null;
            if (b == null)
                head = a;
            else
                b.after = a;
            if (a != null)
                a.before = b;
            else
                last = b;
            if (last == null)
                head = p;
            else {
                p.before = last;
                last.after = p;
            }
            tail = p;
            ++modCount;
        }
    }
class LRUCache extends LinkedHashMap<Integer, Integer>{
    private int capacity;
    public LRUCache(int capacity) {
        super(capacity, 0.75f, true);
        this.capacity = capacity;
    }
    
    public int get(int key) {
        return super.getOrDefault(key, -1);
    }
    
    public void put(int key, int value) {
        super.put(key, value);
    }
    @Override
    protected boolean removeEldestEntry(Map.Entry<Integer,Integer> eldest) {
        return super.size() > capacity;
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */

标签:缓存,capacity,int,LRU,key,null,节点,LinkedHashMap
From: https://www.cnblogs.com/xiaoovo/p/17649906.html

相关文章

  • Redis系列19:LRU内存淘汰算法分析
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • 一行命令即可启动 Walrus丨入门教程
    应用管理平台Walrus已正式开源,本文将介绍如何上手安装Walrus以及如何借助Walrus进行应用部署。 ⭐开源地址:https://github.com/seal-io/walrus 部署Walrus首先,您需要准备:资源不少于4CPU,8Gi内存的Linux服务器。至少50GB的空余磁盘空间。安装Docker服务......
  • 「30 天沉淀 90 mins」Day 1 CPU缓存一致性相关问题——MESI协议
    参考资料小林Coding,也是这里没想到居然讲了这个;先简单复习一下冯诺依曼模型——运算器、控制器、存储器、输入设备、输出设备,以及他们如何交互寄存器分类:通用寄存器,用来存放需要进行运算的数据,比如需要进行加和运算的两个数据。程序计数器,用来存储CPU要执行下一......
  • Spring缓存是如何实现的?如何扩展使其支持过期删除功能?
    前言:在我们的应用中,有一些数据是通过rpc获取的远端数据,该数据不会经常变化,允许客户端在本地缓存一定时间。该场景逻辑简单,缓存数据较小,不需要持久化,所以不希望引入其他第三方缓存工具加重应用负担,非常适合使用SpringCache来实现。但有个问题是,我们希望将这些rpc结果数据缓存起......
  • Spring Cache + Redis 缓存数据使用
    使用SpringCache的好处:1,提供基本的Cache抽象,方便切换各种底层Cache;2,通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;3,提供事务回滚时也自动回滚缓存;4,支持比较复杂的缓存逻辑; 以下以自己的某个模块搞得列子1项目......
  • Spring缓存是如何实现的?如何扩展使其支持过期删除功能? | 京东云技术团队
    前言:在我们的应用中,有一些数据是通过rpc获取的远端数据,该数据不会经常变化,允许客户端在本地缓存一定时间。该场景逻辑简单,缓存数据较小,不需要持久化,所以不希望引入其他第三方缓存工具加重应用负担,非常适合使用SpringCache来实现。但有个问题是,我们希望将这些rpc结果数据缓存起来,并......
  • Redis 缓存满了怎么办?
    引言Redis缓存使用内存来保存数据,随着需要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。此时,应该怎么办?本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。值得注意的是,在Redis中过期策略和内存淘汰策略是两个完全不同的概念。Redis过期策略指的是Redis使......
  • 应用管理平台Walrus开源,构建软件交付新范式
    今日,数澈软件Seal(以下简称“Seal”)宣布正式开源Walrus,这是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点。 借助Walrus将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供易用......
  • 应用管理平台Walrus开源,构建软件交付新范式
    今日,数澈软件Seal(以下简称“Seal”)宣布正式开源Walrus,这是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点。 借助Walrus将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供易用......
  • Leetcode 146 LRUCache
    /***Copyright(C)2023-08-1813:51zxinlog<[email protected]>**/#include<func.h>#defineN1000//普通NodetypedefstructNode{intkey;intvalue;structNode*prev;structNode*next;}Node;//定义HashNodetyped......