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);
    }
}


相关文章
|
消息中间件 安全 API
记项目的一次发送短信及短信模板配置分享
我们日常使用的软件或者网站,大部分都在使用短信业务,比如 注册 、 验证码功能 。还有一些特定的业务需要发送短信通知国内外用户等。有了需求就会有平台提供服务,国内有很多互联网公司都提供短信业务,比如阿里云、腾讯云、七牛。本次我们主要讲解的是阿里云提供的短信服务。
记项目的一次发送短信及短信模板配置分享
|
JSON 前端开发 JavaScript
bootstrap table表格内容居中对齐
bootstrap table表格内容居中对齐
259 0
|
SQL 算法 关系型数据库
MySQL增删改查底层是如何运行的?底层原理是什么?
MySQL增删改查底层是如何运行的?底层原理是什么?
924 0
|
程序员
软技能:开启程序员的职场“破冰之旅”
在我们聊“软技能”之前,先来区分下“软技能”和“硬实力”。通常我们将自己专业方向的技能定义为 “硬技能”,以程序员为例的话,我们的算法、计算机知识和编程能力等就属于“硬技能”,是我们吃饭的家伙,大多数人等着靠他赚钱买车买房娶妻生子,但生活质量的好坏往往由“软技能”决定的,从两类技能的关系来看,“软技能”是“硬技能”的催化剂。
1310 0
|
Ubuntu
Ubuntu10.10 隐藏桌面挂载的磁盘图标
<p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; color:rgb(69,69,69); font-family:Tahoma,Helvetica,Arial,STHeiti; font-size:14px; line-height:21px"> <strong>再用了ub
1431 0
|
7天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
2444 13
|
20天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23546 13
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
5天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
1854 3
|
7天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
1766 1

热门文章

最新文章