lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法

什么是LRU算法?

redis大家都玩过吧,你们好奇redis内存数据存满之后会发生什么吗?抛出异常?禁止使用?还是删除数据?其实redis设计了一种内润淘汰机制。

noeviction(默认策略):屏蔽写操作,返回错误(特殊的写操作除外),但是支持删除操作

volatile-lru:使用LRU算法对设置了过期时间的key进行删除。

allkeys-lru:使用LRU算法对所有key进行删除。

allkeys-random:在所有的key中随即淘汰一部分数据。

volatile-ttl:根据过期时间删除key,越快过期,就会被优先执行删除操作。

volatile-random:在设置了过期时间的key中随机淘汰一部分数据。

使用命令查看redis的淘汰机制:

config get maxmemory-policy

看到没有,其中就有一种LRU算法,那LRU到底是什么呢?最近最少使用的就被淘汰(删除),这样说比较抽象,我举个现实中的例子:假如你买了一个衣柜,用来存放衣服,又因为你平时比较喜欢剁手,买着买着发现衣服太多了,衣柜放不下了,房间有没有其他空间存放,这个时候是不是就需要将衣柜里面的某些衣服送给朋友或者丢掉呢?那你处理哪些衣服呢?你是不是会处理掉不怎么穿,并且买了很久的衣服,不会将你昨天买的就处理掉吧,LRU也是这样,他会保留最近被使用的,删除之前最少被使用的数据。

数组实现一个简单的LRU算法

实现思路:1.创建一个指定长度的数组。2.判断数组是否已被完全使用,如果没有直接将数据添加数组末尾。3.如果数组已经被完全使用,判断此数据在数组中书否存在,如存在:将此数据移到数组末尾,其他数据往前移一位;如不存在,删除数组第一位,然后将数组后面的数据往前移一位,最后将数据添加到数组的末尾。

请看代码:

  /**     * 判断数据是否存在数组中     * @param arr     * @param length     * @param str     * @return     */    public static Integer getIndex(String[] arr, int length, String str) {        for (int i = 0; i < length; i++) {            if (str.equals(arr[i])) {                return i;            }        }        return null;    }    /**     * 使用数组实现LRU算法     *     * @param args     */    public static void main(String[] args) {        String[] arr = new String[5];        String[] newArr;        int length = arr.length;        Scanner input = new Scanner(System.in);        while (true) {            System.out.println("");            System.out.println("请输入数据:");            String str = input.next();            if ("n".equals(str)) {                System.exit(0);            }            newArr = arr.clone();            if(null == arr[length - 1]){                loop:                for (int i = 0; i < length; i++) {                    if (null == arr[i]) {                        arr[i] = str;                        break loop;                    }                }            }else{                Integer index = getIndex(arr, length, str);                if (null == index) {                    // System.out.println("没有在数组中找到数据");                    //数组中找不到数据                    //所有数据左移一位                    for (int i = 1; i < length; i++) {                        arr[i - 1] = newArr[i];                    }                    arr[length - 1] = str;                } else {                    //System.out.println("在数组中找到了数据,下标在:"+index);                    int newArrLength = newArr.length;                    for (int i = 0; i < newArrLength - 1; i++) {                        if (index > i) {                            arr[i] = newArr[i];                        } else {                            arr[i] = newArr[i + 1];                        }                    }                    arr[length - 1] = str;                }            }            //打印结果            for (int i = 0; i < length; i++) {                if (i == (length - 1)) {                    System.out.print(arr[i]);                } else {                    System.out.print(arr[i] + ",");                }            }        }    }

请看结果:

a4e7f49469b1e8a42516c448d07581ff.png

这样,用数组实现一个简单的LRU就完成了,当然,你可以使用集合,还会更简单。

使用链表的集合实现LRU算法

思路:1.判断集合是否完全被使用,如果没有,将数据添加到集合的末尾。2.如果集合空间已被完全使用,判断数据在几何中是否出现过,若没有:删除集合中的第一个元素,将数据添加到集合末尾;如果存在,删除存在的元素,然后再将数据添加到集合末尾。代码实现:

package cn.meiot.test;import java.util.LinkedHashMap;import java.util.Map;import java.util.Scanner;public class LinkedLRU {    public static void main(String[] args) {        Map map = new LinkedHashMap(5);        Scanner input = new Scanner(System.in);        System.out.println("这是用链表集合实现的LRU=================");        while (true){            System.out.println("");            System.out.println("请输入数据:");            String str = input.next();            if ("n".equals(str)) {                System.exit(0);            }            if(map.size() < 5){                map.put(str,str);            }else if(null == map.get(str)){                Map.Entry head = getHead(map);                map.remove(head.getKey());                map.put(str,str);            }else{                map.remove(str);                map.put(str,str);            }            System.out.println(map);        }    }    /**     * 获取第一个元素     * @param map     * @param      * @param      * @return     */    public static  Map.Entry getHead(Map map) {        return  map.entrySet().iterator().next();    }}

结果如下:

c27e1262f50abdac76aa0678a69e07bc.png

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

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

相关文章

bzoj3224 Tyvj 1728 普通平衡树题解--Treap

题面&#xff1a; Description您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x数 2. 删除x数(若有多个相同的数&#xff0c;因只删除一个) 3. 查询x数的排名(若有多个相同的数&…

Blazor University (18)使用 RenderFragments 模板化组件 —— 创建 TabControl

原文链接&#xff1a;https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/创建一个 TabControl 组件源代码[1]接下来我们将创建一个 TabControl 组件。这将教您如何实现以下目标&#xff1a;将数据传递到 RenderFragment 以为其…

Java之GC机制

1 JVM基本结构 1&#xff09;类加载器classLoader&#xff1a;在JVM启动时或者类运行时将需要的.class文件加载到内存中 2&#xff09;内存区域&#xff08;运行时数据区&#xff09;&#xff1a; 是在JVM运行的时候操作所分配的内存区 3&#xff09;执行引擎&#xff1a;负…

《零基础看得懂的C语言入门教程 》——(一)脱离学习误区

本节视频连接&#xff1a; https://www.bilibili.com/video/BV1Qv411t7ae 新手C语言学习有些误区你应该知道&#xff0c;这样学习起来事半功倍~一、前言 距离上一次编写C语言的教程是5年前了&#xff08;2015年&#xff09;&#xff0c;由于自己是从初一时开始学习编程&#…

一套完整的导视设计案例_色彩导视艺术:乌克兰基辅语言学校导视设计案例

学校导视设计案例建筑师Emil Dervish为乌克兰基辅Underhub语言学校设计了色彩缤纷的导视系统&#xff0c;该设计灵感来源于伦敦地铁&#xff0c;他希望通过彩色线条的大胆应用来营造轻松而欢乐的氛围。让我们一起来看看这座由“彩虹”做导视的学校。彩虹导视设计跟着红色导视线…

C# 创建匿名管道

下面对匿名管道执行类似的操作。通过匿名管道&#xff0c;创建两个彼此通信的任务。为了给管道的创建发出信号&#xff0c;使用 ManualResetEventSlim 对象&#xff0c;与内存映射文件一样。在 Program 类的 Run 方法中&#xff0c;创建两个任务&#xff0c;调用 Reader 和 Wri…

内测投票

create table DiaoYanTiMu &#xff08;  Ids int(10) auto_increment not null primary key(),//把所需要的都写上中间不需要符号隔开&#xff0c;设自增长列类型必须是int&#xff0c;主键的话必须不能为空not null&#xff0c; Title varchar(50) not null &#xff09;;/…

Mysql 查询统计练习

2019独角兽企业重金招聘Python工程师标准>>> 1、建表 customers 顾客表 products 产品表 orders 订单表 -- 顾客表 CREATE TABLE customers (c_id INT NOT NULL AUTO_INCREMENT,lastname VARCHAR(255),firstname VARCHAR(255),address VARCHAR(255),birthday DATETI…

C++11模版元编程的应用

1.概述 关于C11模板元的基本用法和常用技巧&#xff0c;我在程序员2015年2月B《C11模版元编程》一文&#xff08;后称前文&#xff09;中已经做了详细地介绍&#xff0c;那么C11模版元编程用来解决什么实际问题呢&#xff0c;在实际工程中又该如何应用呢&#xff1f;本文将侧重…

《零基础看得懂的C语言入门教程 》——(二)C语言没那么难简单开发带你了解流程

一、学习目标 了解DevC集成开发环境了解集成开发环境了解HelloWorld程序了解HelloWorld程序的编写方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1…

11选5下期算法_本周六周日【高二直播】辅导网课预告:通用技术电控二三极管、多用电表测量、数字逻辑电路、解析枚举递归算法,2022浙江选考技术...

01第19-21讲 2020年11月28日29日开课目录鲸学名师考点精讲系统提高高二共3阶段精品课夯实基础冲刺技术选考97-100分&#xff01;11月28日【高二|提高|直播】高二精品直播课讲授&#xff1a;浙江选考技术科目第19讲 高二综合提高鲸学名师讲授高中通用技术&#xff1a;第19讲 电控…

十分钟完成Bash 脚本进阶!列举Bash经典用法及其案例

前言&#xff1a;在linux中&#xff0c;Bash脚本是很基础的知识&#xff0c;大家可能一听脚本感觉很高大上&#xff0c;像小编当初刚开始学一样&#xff0c;感觉会写脚本的都是大神。虽然复杂的脚本是很烧脑&#xff0c;但是&#xff0c;当我们熟练的掌握了其中的用法与技巧&am…

【经典回放】多种语言系列数据结构算法:基数排序

目录 一、算法思路 二、C#语言实现 三、C语言实现 一、算法思路 1. 思想基础 基数排序的思想就是先找出待排序中的最大者&#xff0c;然后按最大者申请一个足够大的内存空间&#xff0c;并将其初始化为零&#xff0c;然后将所有待排序的数装入其中&#xff0c;标记装入的数…

探索链路追踪在.NET6工业物联网项目中的应用

如果觉得有用&#xff0c;请留言学到了。已经会了的老哥&#xff0c;请留言就这&#xff1f;可能遇到的问题工业物联网系统自上而下一般分为ERP、Mes、SCADA、WCS、边缘网关、设备等一个生产订单从SAP发送到设备要经过上述多个系统&#xff0c;当某个环节出现问题&#xff0c;可…

《零基础看得懂的C语言入门教程 》——(三)轻轻松松理解第一个C语言程序

一、学习目标 了解C语言代码的一般结构了解函数的概念了解printf函数的使用方法了解头文件的概念了解system函数的使用方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误…

hdu_1728_逃离迷宫(bfs)

题目连接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1728 题意&#xff1a;走迷宫&#xff0c;找最小的拐角 题解&#xff1a;对BFS有了新的理解&#xff0c;DFS剪枝应该也能过&#xff0c;用BFS就要以拐角作为增量来搜&#xff0c;即以当前点为坐标&#xff0c;4…

把文件放在SD卡

2019独角兽企业重金招聘Python工程师标准>>> 在程序中访问SDCard&#xff0c;你需要申请访问SDCard的权限。 在AndroidManifest.xml中加入访问SDCard的权限如下: <!-- 在SDCard中创建与删除文件权限--> <uses-permissionandroid:name"android.permiss…

如何用 windbg 导出 C# 中的 string 内容?

咨询区 driis我在用 windbg 调试一个生产上的 程序卡死 故障 &#xff0c;在线程栈上有一个 string 类型的参数相当大&#xff0c;我用 !dumpobj 命令不能正常显示内容&#xff0c;参考如下&#xff1a;0:036> !do 00000001b30d8668 Name: System.String MethodTable: 00000…

《零基础看得懂的C语言入门教程 》——(四)C语言的基本数据类型及变量

一、学习目标 了解C语言的基本数据类型了解变量的基本概念了解变量的使用方法了解了变量的命名方法了解格式占位符了解变量的输出 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离…

转HTML+CSS总结/深入理解CSS盒子模型

原文地址&#xff1a;http://www.chinaz.com/design/2010/1229/151993.shtml 前言&#xff1a;前阵子在做一个项目时&#xff0c;在页面布局方面遇到了一点小问题&#xff0c;于是上stackoverflow上求助。ifaou在帮助我解决我问题的同时&#xff0c;还推荐我阅读一篇有关CSS盒子…