Java简单实现一个LRU(最近最少使用淘汰策略)

news2024/12/27 0:42:10

目录

LRU介绍:

一些淘汰策略:

Java简单实现LRU:

测试:

​编辑

实现原理:


LRU介绍:

LRU 是 "Least Recently Used" 的缩写,意为"最近最少使用"。它是计算机科学中的一种缓存淘汰策略,主要用于缓存内存管理。LRU 的原理是在缓存已满且需要添加新项时,从缓存中移除最近最少使用的项。

        通常用于操作系统种内存页的置换,把不常用的放回外存,常用的放入内存,可以提高我们所需的数据在内存的命中率。

        同时在redis中也会用到,redis是一种内存数据库,我们想要redis中存储我们的热点数据,就需要把一些不常用的数据替换掉,所以redis提供了多种的淘汰更新策略。

一些淘汰策略:

  1. No Eviction (无淘汰): 当内存达到限制时,新写入操作会导致写入操作失败并返回错误。

  2. All Keys Random (随机淘汰): Redis 会从所有的键中随机选择一个进行淘汰。

  3. Volatitle Least Recently Used (Volatile-LRU): Redis 会从设置了过期时间的键中,选择最近最少使用的键进行淘汰。

  4. Volatile Least Frequently Used (Volatile-LFU): Redis 会从设置了过期时间的键中,选择最不经常使用的键进行淘汰。

  5. Volatile Random (Volatile-Random): Redis 会从设置了过期时间的键中随机选择一个进行淘汰。

  6. Least Recently Used (LRU): Redis 会从所有的键中,选择最近最少使用的键进行淘汰。

  7. Least Frequently Used (LFU): Redis 会从所有的键中,选择最不经常使用的键进行淘汰。

  8. Random (随机): Redis 会从所有的键中随机选择一个进行淘汰。

        在 Redis 中,可以通过配置 maxmemory-policy 参数来指定使用的淘汰策略。每种策略都有其适用的场景,选择合适的淘汰策略可以更好地管理内存和提高性能。

        在一般情况下,用的最多的当然就是LRU最近最少使用, 因为最近被访问次数越多的数据,在未来被访问的概率会更高,我们无法预测未来发生什么,所以淘汰最近少使用的,正常都是相对较好的选择。

Java简单实现LRU:

class Memory {
    private static PriorityQueue<Pair<Integer, Integer>> pq = new PriorityQueue<>((a, b) -> {
        return a.getValue() - b.getValue();
    }); // pair<key, count>
    private static int size = 3;

    public static void select(int key) {

        System.out.println(key + "进行查询");
        for (Pair<Integer, Integer> t: pq) {
            if (t.getKey() == key) {
                int nextCount = t.getValue() + 1;
                pq.remove(t);
                pq.offer(new Pair<>(t.getKey(), nextCount));
                return;
            }
        }
        pq.offer(new Pair<>(key, 1));
        if (pq.size() > size) {
            pq.poll();
        }
    }

    public static void show() {

        System.out.println(pq.toString());
    }

}

测试:

public class Main {
    public static void main(String[] args) {
        Memory memory = new Memory();

        Memory.select(1);
        Memory.show();
        Memory.select(2);
        Memory.show();
        Memory.select(1);
        Memory.show();
        Memory.select(3);
        Memory.show();
        Memory.select(4);
        Memory.show();
        Memory.select(3);
        Memory.show();
        Memory.select(5);
        Memory.show();
    }
}

实现原理:

        我这里是用的一个优先级队列,也就是堆来实现,因为堆可以很好的进行排序,同时控制堆中的节点个数。

        每个节点存储的一个pair对,key放的是元素,value则放的是该元素最近被使用的次数。排序就是利用value来进行的。每次要加入一个元素,先判断是否已经存在与堆中,若存在,那么value + 1返回,若不存在就加入堆中,然后判断堆中的个数是否已经大于size规定个数,若大于则进行弹出,因为是小顶堆,弹出的一定是最近使用次数最少的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCODE EIDE使用debug记录

用上vscode之后就感觉之前的keil不太爽了&#xff0c;找什么东西搜索都很麻烦&#xff0c;之前有写过eide的文章&#xff0c;想着能不能在eide里面就把debug也做了&#xff0c;发现真的可以&#xff0c;下面记录一下&#xff0c;主要是参考这个大佬的文章&#xff0c;非常感谢。…

k8s CNI Calico 网络模式总结

目录 calico架构图 IPIP模式下的架构图 calico 核心组件 Overlay 网络模式&#xff1a; Pod IP对外暴露 不对外暴露&#xff1a; 实现对外暴露的方法&#xff1a; overlay模式下的网络MTU Iptables & ipvs overlay的主要缺点&#xff1a; Full-mesh Unoverla…

Java毕业设计 基于SSM jsp商城系统 美妆系统

Java毕业设计 基于SSM jsp商城系统 美妆系统 SSM jsp 商城系统 美妆系统 功能介绍 首页 分类展示商品 搜索商品 登录 注册 邮箱激活 购物车 结算 支付 我的订单 个人信息设置 后台管理 登录 商品管理 添加修改下架商品 商品类型管理 添加修改删除分类 订单管理 确认发货 取消…

Leetcode 216.组合总和III

题目 思路 题目说只使用数字1-9&#xff0c;是k个数的和 树的宽度是1-9&#xff0c;树的深度是k 1.确定递归函数的返回值及参数&#xff1a; 返回值是void,参数这里还是先设定两个全局变量。一个是path存放符合条件单一结果。如&#xff1a;&#xff08;1&#xff0c;2&…

Web攻击越发复杂,企业如何保护云上业务

如今&#xff0c;电子政务、电子商务、网上银行、网上营业厅等依托Web应用&#xff0c;为广大用户提供灵活多样的服务。在这之中&#xff0c;流量攻击堪称是Web应用的最大敌人&#xff0c;黑客通过流量攻击获取利益、竞争对手雇佣黑客发起恶意攻击、不法分子通过流量攻击瘫痪目…

[VulnHub靶机渗透] pWnOS 2.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

TiDB 实战分享丨第三方支付企业的核心数据库升级之路

本文介绍了一家第三方支付企业在面对市场竞争和监管压力的态势下&#xff0c;通过升级核心数据库来提升业务能力的实践。该企业选择 TiDB 分布式数据库&#xff0c;成功将其应用于核心业务、计费、清结算和交易查询等关键系统。TiDB 的水平扩展能力、高可用性和简化数据栈等优势…

交叉验证(Cross-Validation)

交叉验证的基本概念 交叉验证通常用于评估机器学习模型在未知数据上的性能。它将数据集分成k个不同的子集&#xff0c;然后进行k次训练和验证。在每次迭代中&#xff0c;选择一个子集作为测试集&#xff0c;其余的子集作为训练集。这样&#xff0c;每个子集都用作过测试集&…

二、计算机网络体系结构参考模型

一、分层结构 &#xff08;一&#xff09;为什么要分层&#xff1a; 发送文件/数据前要完成的工作&#xff1a; 1&#xff09;发起通信的计算机必须讲数据通信通路进行激活 2&#xff09;要告诉网络如何识别目的主机 3&#xff09;发起通信的计算机要查明目的主机是否开机、并且…

实时渲染 -- 体素化(Voxelization)

我们之前讨论的大部分问题都是关于面表示的。由于这些方法不需要显式地表示物体的内部空间&#xff0c;所以非常高效。 体建模方法表示的是实体而不是表面。使用体模型可以产生更丰富的仿真效果&#xff0c;如物体的运动学行为和半透明光照效果。 一、有限元模型 有限元模型…

升级一下电脑,CPU换I5-14600K,主板换华硕B760M

刚给自己电脑升级了一下&#xff0c;CPU从 AMD R5 5600X 换成 Intel I5-14600K&#xff0c;主板换成了华硕的 TUF GAMING B760M-PLUS WIFI D4。 因为我现有的两根内存是DDR4的&#xff0c;所有我选了个支持DDR4内存的主板。 我发现用AMD处理器时将系统从Win10升级到Win11后变…

关于Linux系统中使用Kazam录制的视频在Win系统中无法播放的问题解决办法

今天在linux系统【ubuntu】中录制了一段视频&#xff0c;想要在win系统中进行剪辑&#xff0c;但是发现无法打开&#xff0c;使用的是Kazam录制的mp4格式视频。 Kazam录制安装与使用方式&#xff1a; 安装方式——linux终端输入&#xff1a; sudo apt-get install kazam使用…

04---webpack编写可维护的构建配置

01 构建配置抽离成npm包&#xff1b; 意义&#xff1a;通用性&#xff1a; 业务开发者无需关注构建配置 统一团队构建脚本可维护性&#xff1a;构建配置合理的拆分 质量&#xff1a;冒烟测试 单元测试 持续集成构建配置管理的可选方案&#xff1a;1 通过多个配置文件管理不同…

Android模拟器Android Emulator进行快照snapshot保存时问题

在用Android Emulator进行快照保存时出现问题&#xff0c;不能保存快照&#xff0c;并提示 current state is not support snapshot。 在网上查找了一圈&#xff0c;发现没有针对这个问题的方案&#xff0c;比较接近的方案都是eclipse年代的&#xff0c;说要进行enable snaps…

刷题之Leetcode27题(超级详细)

27. 移除元素 力扣题目链接(opens new window)https://leetcode.cn/problems/remove-element/ 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用…

可以写网易云的了!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 259篇原创内容-gzh 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中…

苍穹外卖Day04套餐管理部分总结

写给像我一样完完全全的小白的。本人代码水平一塌糊涂&#xff0c;前几天就是机械地跟着视频敲代码。对于Day04的作业本来感觉代码抓瞎一点不会写&#xff0c;尽力去理解业务逻辑后发现好像也没那么难&#xff0c;整体代码可以仿照Day03新增菜品来进行实现&#xff01; 一、功…

scratch寻找好朋友 2024年3月中国电子学会 图形化编程 scratch编程等级考试二级真题和答案解析

目录 scratch寻找好朋友 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、…

如何在Linux中安装软件

文章目录 一、Linux应用程序基础1.Linux软件安装包分类2.应用程序和系统命令的关系3.常见的软件包的封装类型 二、安装软件的方式1.RPM包管理工具2.yum安装3.编译 一、Linux应用程序基础 1.Linux软件安装包分类 Linux源码包&#xff1a; 实际上&#xff0c;源码包就是一大堆源…

Spring/SpringBoot/SpringCloud Mybatis 执行流程

在后续分析Mybatis 流程中代码的可能会用到IDEA debug 技巧&#xff1a; 条件断点 代码断点&#xff0c;右键 勾选弹窗 Condition &#xff1a; 写入表达式 回到上一步&#xff1a; Java动态代理实现 InvocationHandler接口&#xff1a; package com.lvyuanj.core.test;…