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] + ","); } } } }
请看结果:
这样,用数组实现一个简单的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算法相关推荐
- 用C语言或C++编写一个简单的银行家算法模拟程序
1.问题描述 银行家算法是操作系统中避免死锁的典型算法.用C语言或C++编写一个简单的银行家算法模拟程序,实现多个进程争用系统临界资源时的分配过程.要求程序实现: 1.当一进程请求一组资源时,先确定是 ...
- 子图同构算法——Ullmann算法(1)不包含refine procedure的简单穷举算法。
摘要: 转载请注明来自stanlysheng--talk is cheap, show me your code.http://www.cnblogs.com/stanly/ .谢谢.此文我也在CSD ...
- 一个简单的全排列算法
什么是全排列?就是从n个数字中选择n个数字按照一定的顺序排列起来. 本文要讨论的算法要完成的任务是:给定一个数组,输出其所有的全排列结果.要求可以概括为两点: 输出该数组所有的全排列结果 任意两个全排 ...
- 用c语言实现数据结构算法将两个有序链表并为一个有序链表的算法,,(完整版)数据结构-习题集答案-(C语言版严蔚敏)...
} 2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n.试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连 ...
- Linux GCC下strstr的实现以及一个简单的Kmp算法的接口
今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: 1 char *strstr(const char*s1,const char*s2) 2 { ...
- 推荐算法的介绍以及实现一个简单的推荐算法(python实现协同过滤)
推荐算法: 推荐算法是计算机专业中的一种算法,通过一些数学算法,推测出用户可能喜欢的东西,目前应用推荐算法比较好的地方主要是网络,其中淘宝做的比较好. 发展背景: 推荐算法的研究起源于20世纪 ...
- 双向链表的一个简单的例子
以前写的 最近找出来 加上了逆置的功能 #include<iostream> #include<string> #define N 10 using namespace std ...
- js数组按中文拼音排序_学习排序算法,结合这个方法太容易理解了
排序是一个经典的问题,它以一定的顺序对一个数组或列表中的元素进行重新排序.而排序算法也是各有千秋,每个都有自身的优点和局限性.虽然这些算法平常根本就不用自己去编写,但作为一个有追求的程序员,还是要了解 ...
- TP5 实现基于标签简单的推荐算法
1.算法思想 1.1.理解算法过程 我们在写算法的时候要先理解我们的对象和之间的关系,我这里举例供求信息和用户设置标签,两者关系是,系统会根据用户设置的标签来匹配与其相似度较高的,同时用户发布的供求信 ...
最新文章
- 浅谈网络协议(四) IP的由来--DHCP与PXE
- 5大架构:细数数据平台的组成与扩展
- mysqldatareader获取整行数据给datarow_C# sqladapter 与sqldataReader
- 网络协议,我明明学过的呀?
- 520 钻石争霸赛 7-6 矩阵列平移(循环)
- python3语法糖_Python笔记3:语法糖
- aws lambda_它会融合吗? 或如何在AWS Lambda中运行Google Chrome
- 轮播图实现html,html、css、js实现轮播图
- java 数据挖掘 开源_5个开源数据挖掘工具,收下这波干货
- jQuery操作input值总结
- Adobe Flash Professional CS6安装失败问题
- android cs bs 架构,BS架构与CS架构的区别
- spring boot启动报错:Reason: Canonical names should be kebab-case (‘-‘ separated), lowercase
- 逆概率加权Doubly Robust Methods
- 学计算机要高智商吗,这7大高智商专业,很容易挂科,如果不是学霸级人物,最好不要报考...
- python提取excel指定关键词的行数据
- iOS Bug---CoreLocation 部分机型卡界面
- 专家有料 | 张祖优:腾讯云DevSecOps实践与开源治理探索
- 智能家居正进化成人们想要的样子
- 树莓4b驱动开发:Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP
热门文章
- ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)
- 在香蕉派的树莓派系统上配置 Syncthing 自启动(暨 Linux 软件自启服务配置)
- Dapr微服务应用开发系列0:概述
- EF Core 3.0查询
- Asp.Net Core Mvc Razor之RazorPage
- 代码整洁之道(Clean Code)- 读书笔记
- 如何在你的项目中集成 CAP【手把手视频教程】
- 实体类的动态生成(一)
- 拥抱.NET Core系列:MemoryCache 初识
- Visual Studio 2017 15.3 预览版发布,接近最终版