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

目录

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规定个数,若大于则进行弹出,因为是小顶堆,弹出的一定是最近使用次数最少的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 计算机网络

目录 一、网络协议 1、 "协议" 是一种约定 2、协议分层 二、网络模型 1、OSI七层模型 2、TCP/IP五层(或四层)模型 三、网络传输基本流程 四、数据包封装和分用 五、网络中的地址管理 六、网络编程套接字 1、理解源IP地址和目的IP地址 2、端口号 理解 &q…

console.log输出五彩斑斓的颜色

console.log 最经常使用它在控制台输出信息然后进行代码调试&#xff0c;会发现输出信息的颜色永远是黑色。本文教学如何用 console.log在控制台输出具有五彩斑斓颜色的信息。 单色输出 console.log(\x1B[31m红色\x1B[34m 蓝色) console.log(%c字符&#xff1a;, color:red, …

(二)ffmpeg 下载安装以及拉流推流示例

一、ffmpeg下载安装 官网&#xff1a;https://www.ffmpeg.org/ 源码下载地址&#xff1a;https://www.ffmpeg.org/download.html#releases 下载源码压缩包 下载完成之后解压并在该目录下打开命令窗口 安装依赖环境&#xff1a; sudo apt-get install build-essential nasm …

Can Transformer and GNN Help Each Other?

ABSTRACT 尽管 Transformer 在自然语言处理和计算机视觉方面取得了巨大成功&#xff0c;但由于两个重要原因&#xff0c;它很难推广到中大规模图数据&#xff1a;(i) 复杂性高。 (ii) 未能捕获复杂且纠缠的结构信息。在图表示学习中&#xff0c;图神经网络&#xff08;GNN&…

Vue中key的原理以及diff算法

简介&#xff1a;Vue的key用于在虚拟DOM中标记节点&#xff0c;方便后面的diff对比算法进行对比&#xff0c;提升效率。 Vue的vm或者vc实例一共管理着3个DOM对象&#xff0c;分别他的模板对应的真实DOM、真实DOM的备份、以及重新生成的新的DOM&#xff0c;后两个可以看成是虚拟…

Prometheus实现自定义脚本监控

#Prometheus# 监控路漫漫其修远兮&#xff0c;吾将上下而求索&#xff01; 一、前言 在监控工作过程中经常会收到大量的定制化的监控需求&#xff0c;Prometheus就提供了一个很强大的组件 --> Pushgateway&#xff0c;他不仅是网关的用途接收exporter的数据&#xff0c;还…

参与 PenPad Season 2 获得勋章,还有海量 Scroll 生态稀缺权益

PenPad 是 Scroll 生态中的首个 LaunchPad 平台&#xff0c;该平台继承了 Scroll 生态的技术优势&#xff0c;具备包括隐私在内的系列特点&#xff0c;同时且也被认为是 Scroll 生态最重要的价值入口之一。Penpad 与 Scroll 官方始终保持着合作&#xff0c;同时该项目自启动以来…

关于无人机,你必须知道的事!!(科技篇)

飞行器的五脏六腑 电机&#xff1a;无人机的动力单元&#xff0c;俗称“马达”。通过电机转动来驱动螺旋桨旋转&#xff0c;最终让飞机上天。 电调&#xff1a;无人机的动力单元&#xff0c;是接收油门信号并调整电机转速的控制枢纽&#xff0c;俗称电机的“黑屋调教师” 飞…

记录Http访问服务接口出现 301 Moved Permanently

记录Http访问服务接口出现 301 Moved Permanently 一、项目背景 ​ 在A服务中 需要通过远程调用 B服务接口 获取数据。A项目与B项目部署在不同的服务接口中。 请求接口响应界面 ​ 在调用B项目的接口时&#xff0c;响应的数据一直为 301 Moved Permanently Html代码&#x…

一文看懂Mac地址

一、Mac地址是什么&#xff1f; 虽然IP地址已经成为一个家喻户晓的术语&#xff0c;但还有一个同样重要的数字标识符值得我们关注——MAC地址。在本文中&#xff0c;我们旨在阐明网络中这个经常被忽视的方面。加入我们&#xff0c;深入研究 MAC 地址的世界&#xff0c;了解它们…

Vue3大事件项目1 登录注册验证

创建项目 引入 element-ui 组件库 登录&#xff1a;注册样式准备之后&#xff0c;配置校验规则&#xff08;4个条件&#xff1a;一数据、二规则&#xff09; 1. 校验相关 (1) 给当前表单绑上整个的数据对象&#xff1a;el-form > :model"ruleForm" 绑…

统一处理异常和记录日志

统一处理异常 SpringBoot设计&#xff0c;如果出现错误404或500&#xff0c;自动调用特定路径下的html页面(路径和名字都特定)。/templates/error/404.html、/templates/error/500.html。程序中有错误自动就调用该页面。 但是错误有异步请求错误&#xff0c;也想同时记录日志。…

【Docker】搭建达梦数据库(基于 X86 架构)

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、背景介绍 二、搭建过程 1、部署环境 2、准备工作 3、运行容器 4、等待就绪 5、登…

RabbitMQ-canal 监听本地数据库 -收不到消息解决方法

一、当我们配置好canal 的配置文件后 发现log 日志不报错&#xff0c;但是消息队列就是监听不到数据库的消息。 二、解决方法 在mysql 的ini 配置文件中加入下列代码 connect_timeout60 # 将默认值&#xff08;如30秒&#xff09;改为60秒 wait_timeout28800 # 将空闲连接超时…

【opencv】示例-falsecolor.cpp 使用OpenCV函数动态地对图像应用不同的色彩映射

该代码是一个使用OpenCV库实现的C程序&#xff0c;主要用来展示如何通过applyColorMap函数将色彩映射应用到一个灰度图像上&#xff0c;并提供一个滑动条来实时改变色彩映射的效果。此外&#xff0c;该程序还可以绘制包含不同形状的灰度图像&#xff0c;用作applyColorMap函数的…

【vue】v-if 条件渲染

v-if 不适用于频繁切换显示模式的场景 修改web.user&#xff0c;可看到条件渲染的效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

Java+BS +saas云HIS系统源码SpringBoot+itext + POI + ureport2数字化医院系统源码

JavaBS saas云HIS系统源码SpringBootitext POI ureport2数字化医院系统源码 医院云HIS系统是一种运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它按照现代医疗卫生管理要求&#xff0c;在特定区域内以数字化形式收集、存储、传递和处理医疗卫生行业的数据。通…

leaflet知识点:地图窗格panes的应用

一&#xff0c;需求背景 地图中存在无人机&#xff0c;停机坪&#xff0c;航线三个图层&#xff0c;需要实现无人机图层显示在最上面&#xff0c;停机坪图层显示在最下面&#xff0c;航线图层显示在中间。 二&#xff0c;遇到问题 由下图可知航线图层所在overlayPane窗格的z-…

光伏无人机+卫星踏勘有哪些优势?

随着科技的不断进步和智能化的发展&#xff0c;光伏无人机与卫星踏勘的结合为光伏电站的巡检、监测以及前期踏勘带来了革命性的改变。这种先进的组合方式不仅提升了工作效率&#xff0c;更在安全性、准确性以及环保性等方面展现出了显著的优势。 首先&#xff0c;光伏无人机和…

从文字到思维:呆马GPT在人工智能领域的创新之旅

引言 生成式预训练变换器&#xff08;Generative Pre-trained Transformer&#xff0c;简称GPT&#xff09;领域是人工智能技术中的一大革新。自OpenAI推出第一代GPT以来&#xff0c;该技术经历了多代发展&#xff0c;不断提升模型的规模、复杂度和智能化程度。GPT模型通过在大…