什么是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] + ",");                }            }        }    }

请看结果:

这样,用数组实现一个简单的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();    }}

结果如下:

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

  1. 用C语言或C++编写一个简单的银行家算法模拟程序

    1.问题描述 银行家算法是操作系统中避免死锁的典型算法.用C语言或C++编写一个简单的银行家算法模拟程序,实现多个进程争用系统临界资源时的分配过程.要求程序实现: 1.当一进程请求一组资源时,先确定是 ...

  2. 子图同构算法——Ullmann算法(1)不包含refine procedure的简单穷举算法。

    摘要: 转载请注明来自stanlysheng--talk is cheap, show me your code.http://www.cnblogs.com/stanly/ .谢谢.此文我也在CSD ...

  3. 一个简单的全排列算法

    什么是全排列?就是从n个数字中选择n个数字按照一定的顺序排列起来. 本文要讨论的算法要完成的任务是:给定一个数组,输出其所有的全排列结果.要求可以概括为两点: 输出该数组所有的全排列结果 任意两个全排 ...

  4. 用c语言实现数据结构算法将两个有序链表并为一个有序链表的算法,,(完整版)数据结构-习题集答案-(C语言版严蔚敏)...

    } 2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n.试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连 ...

  5. Linux GCC下strstr的实现以及一个简单的Kmp算法的接口

    今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: 1 char *strstr(const char*s1,const char*s2) 2 { ...

  6. 推荐算法的介绍以及实现一个简单的推荐算法(python实现协同过滤)

    推荐算法: ​ 推荐算法是计算机专业中的一种算法,通过一些数学算法,推测出用户可能喜欢的东西,目前应用推荐算法比较好的地方主要是网络,其中淘宝做的比较好. 发展背景: ​ 推荐算法的研究起源于20世纪 ...

  7. 双向链表的一个简单的例子

    以前写的 最近找出来 加上了逆置的功能 #include<iostream> #include<string> #define N 10 using namespace std ...

  8. js数组按中文拼音排序_学习排序算法,结合这个方法太容易理解了

    排序是一个经典的问题,它以一定的顺序对一个数组或列表中的元素进行重新排序.而排序算法也是各有千秋,每个都有自身的优点和局限性.虽然这些算法平常根本就不用自己去编写,但作为一个有追求的程序员,还是要了解 ...

  9. TP5 实现基于标签简单的推荐算法

    1.算法思想 1.1.理解算法过程 我们在写算法的时候要先理解我们的对象和之间的关系,我这里举例供求信息和用户设置标签,两者关系是,系统会根据用户设置的标签来匹配与其相似度较高的,同时用户发布的供求信 ...

最新文章

  1. 浅谈网络协议(四) IP的由来--DHCP与PXE
  2. 5大架构:细数数据平台的组成与扩展
  3. mysqldatareader获取整行数据给datarow_C# sqladapter 与sqldataReader
  4. 网络协议,我明明学过的呀?
  5. 520 钻石争霸赛 7-6 矩阵列平移(循环)
  6. python3语法糖_Python笔记3:语法糖
  7. aws lambda_它会融合吗? 或如何在AWS Lambda中运行Google Chrome
  8. 轮播图实现html,html、css、js实现轮播图
  9. java 数据挖掘 开源_5个开源数据挖掘工具,收下这波干货
  10. jQuery操作input值总结
  11. Adobe Flash Professional CS6安装失败问题
  12. android cs bs 架构,BS架构与CS架构的区别
  13. spring boot启动报错:Reason: Canonical names should be kebab-case (‘-‘ separated), lowercase
  14. 逆概率加权Doubly Robust Methods
  15. 学计算机要高智商吗,这7大高智商专业,很容易挂科,如果不是学霸级人物,最好不要报考...
  16. python提取excel指定关键词的行数据
  17. iOS Bug---CoreLocation 部分机型卡界面
  18. 专家有料 | 张祖优:腾讯云DevSecOps实践与开源治理探索
  19. 智能家居正进化成人们想要的样子
  20. 树莓4b驱动开发:Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP

热门文章

  1. ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)
  2. 在香蕉派的树莓派系统上配置 Syncthing 自启动(暨 Linux 软件自启服务配置)
  3. Dapr微服务应用开发系列0:概述
  4. EF Core 3.0查询
  5. Asp.Net Core Mvc Razor之RazorPage
  6. 代码整洁之道(Clean Code)- 读书笔记
  7. 如何在你的项目中集成 CAP【手把手视频教程】
  8. 实体类的动态生成(一)
  9. 拥抱.NET Core系列:MemoryCache 初识
  10. Visual Studio 2017 15.3 预览版发布,接近最终版