LRU算法

简介: LRU是Least Recently Used的缩写,意思就是最近最少使用,常用于页面置换的一种算法。LRU算法的提出,是基于这样一个场景:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是著名的局部性原理。此外,LRU算法也经常被用作缓存淘汰策略。本文将基于LRU算法的思想,使用Java语言实现一个我们自己的缓存工具类

什么是LRU算法

     LRU是Least Recently Used的缩写,意思就是最近最少使用,常用于页面置换的一种算法。LRU算法的提出,是基于这样一个场景:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是著名的局部性原理。此外,LRU算法也经常被用作缓存淘汰策略。本文将基于LRU算法的思想,使用Java语言实现一个我们自己的缓存工具类

背景

     当我们想要实现一个搜索框搜索内容(想要把最近n小时搜索的内容显示出来方便我们直接选中),这里声明一下不是最多最近。那我们使用LRU算法的机制实现缓存淘汰策略就再好不过了

算法思想

  • 新数据插入到链表头部
  • 每当命中查询(即缓存中的数据被访问),则将数据移到链表头部
  • 当链表满的时候,将链表尾部的数据丢弃。

数据结构

JAVA实现缓存淘汰demo


importjava.util.HashMap;
importjava.util.Map;
publicclassLRUCache {
// 双向链表节点定义classNode {
intkey;
intval;
Nodeprev;
Nodenext;
    }
//模拟缓存容量privateintcapacity;
//保存链表的头节点和尾节点privateNodefirst;
privateNodelast;
//从key到node映射的mapprivateMap<Integer, Node>map;
publicLRUCache(intcapacity) {
this.capacity=capacity;
map=newHashMap<>(capacity);
    }
publicintget(intkey) {
Nodenode=map.get(key);
//为空返回-1if (node==null) {
return-1;
        }
moveToHead(node);
returnnode.val;
    }
publicvoidput(intkey, intvalue) {
//先看看是否已经存在Nodenode=map.get(key);
if (node==null) {
//不存在创建节点,然后判断缓存是否满了,如果满了删除最后一个节点。然后将新节点放到链表头部,增加一个映射关系//存在则直接覆盖,然后移动到头部node=newNode();
node.key=key;
node.val=value;
if(map.size() ==capacity) {
removeLast();
            }
addToHead(node);
map.put(key, node);
        } else {
node.val=value;
moveToHead(node);
        }
    }
privatevoidmoveToHead(Nodenode) {
//要修改很多指针if (node==first) {
return;
        } elseif (node==last) {
//如果是最后一个节点,将最后一个节点的next指针置为空,然后last指向前一个节点last.prev.next=null;
last=last.prev;
        } else {
//如果是中间节点,中间节点的前节点的后指针  指向 中间节点的后节点//中间节点的后节点的前指针 指向 中间节点的前节点node.prev.next=node.next;
node.next.prev=node.prev;
        }
//把该节点作为头结点node.prev=first.prev;// 写成node.prev = null;更好理解node.next=first;
first.prev=node;
first=node;
    }
privatevoidaddToHead(Nodenode) {
if (map.isEmpty()) {
first=node;
last=node;
        } else {
//把新节点作为头结点node.next=first;
first.prev=node;
first=node;
        }
    }
privatevoidremoveLast() {
map.remove(last.key);
NodeprevNode=last.prev;
//修改last所指的位置if (prevNode!=null) {
prevNode.next=null;
last=prevNode;
        }
    }
@OverridepublicStringtoString() {
returnmap.keySet().toString();
    }
publicstaticvoidmain(String[] args) {
LRUCachecache=newLRUCache(3);
cache.put(1, 1);//【1】左边是最近使用的cache.put(2, 2);//【2,1】cache.put(3, 3);//【3,2,1】cache.get(1);//【1,3,2】cache.put(4, 3);//【4,1,3】System.out.println(cache);
    }
}


相关文章
|
数据可视化 安全 数据安全/隐私保护
使用Python做个可视化的“剪刀石头布”小游戏
使用Python做个可视化的“剪刀石头布”小游戏
454 0
|
Web App开发 Python
Python使用selenium的Chrome下载文件报错解决
Python使用selenium的Chrome下载文件报错解决
541 0
|
Java 开发工具 Android开发
【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试
【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试
【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试
|
消息中间件 安全 API
记项目的一次发送短信及短信模板配置分享
我们日常使用的软件或者网站,大部分都在使用短信业务,比如 注册 、 验证码功能 。还有一些特定的业务需要发送短信通知国内外用户等。有了需求就会有平台提供服务,国内有很多互联网公司都提供短信业务,比如阿里云、腾讯云、七牛。本次我们主要讲解的是阿里云提供的短信服务。
记项目的一次发送短信及短信模板配置分享
|
缓存 算法 JavaScript
纯函数在实际开发中的应用场景有哪些
纯函数在实际开发中广泛应用,如React等框架的状态管理、数据处理和验证、缓存机制等,因其无副作用、可预测性及易于测试的特点,提升了代码的可靠性和维护性。
|
12月前
|
人工智能 运维 调度
破解 vLLM + DeepSeek 规模化部署的“不可能三角”
人工智能产业的蓬勃发展催生了丰富多样的推理模型,为解决特定领域的问题提供了高效的解决方案。DeepSeek 的爆火就是极佳的范例。然而,对于个人用户而言,如何有效地利用这些模型成为一个显著的挑战——尽管模型触手可及,但其复杂的部署和使用流程却让人望而却步。针对这一现象,在大型语言模型(LLM)领域,vLLM 应运而生。通过便捷的模型接入方式,vLLM 让用户能够轻松地向模型发起推理请求,从而大大缩短了从模型到应用的距离。
|
SQL 分布式计算 数据处理
云产品评测|分布式Python计算服务MaxFrame | 在本地环境中使用MaxFrame + 基于MaxFrame实现大语言模型数据处理
本文基于官方文档,介绍了由浅入深的两个部分实操测试,包括在本地环境中使用MaxFrame & 基于MaxFrame实现大语言模型数据处理,对步骤有详细说明。体验下来对MaxCompute的感受是很不错的,值得尝试并使用!
321 1
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
605 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
547 1
|
测试技术 数据安全/隐私保护 Java
基于SpringBoot+Vue+uniapp的代驾应用系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的代驾应用系统的详细设计和实现(源码+lw+部署文档+讲解等)
227 0