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.pswp.cn/news/287851.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287851.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287851.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【經典回放】多種語言系列數據結構算法:歸并排序

目錄 干貨1:C#語言實現歸并排序! 干貨2:C語言實現歸并排序! 干貨1:C#語言實現歸并排序! 一、算法 1、思想基礎

Java對象和類

轉自原文&#xff1a;http://www.yiibai.com/java/java_object_classes.html java是一種面向對象的語言。由于具有面向對象特性的語言&#xff0c;Java支持以下基本概念&#xff1a; 多態性繼承封裝抽象化類對象實例方法消息解析在本章中&#xff0c;我們將探討類和對象這些概念…

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;負…

ArcGIS實驗教程——實驗十八:疊置分析(Overlay Analysis)

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據) 目 錄 一、實驗描述 二、實驗內容 三、實驗目的 四、實驗數據

《零基礎看得懂的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;;/…

Android之通過Binder機制實現IPC和linux的傳統IPC的對比分析

一、 Android的Binder機制實現IPC 這里bind機制實現實現IPC模型這里不具體分析,簡單理解就是clint-server模型 涉及到4個模塊client、server、serverManager、bind底層驅動。 serverManager的作用是將字符形式的Binder(Server創建了Binder實體)名字轉化成Client中對該Bin…

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#語言實現堆排序 三、C語言實現堆排序 一、堆排序算法分析

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;標記裝入的數…

Java之ThreadPoolExcutor和四種常見的線程池

一、ThreadPoolExcutors的作用 java提供了ThreadPoolExcutors來創建一個線程池&#xff0c;我們為什么要用線程池呢? 1.降低資源的消耗&#xff1a;通過重復利用已經創建好的線程降低線程的創建和銷毀帶來的損耗 2.提高響應速度&#xff1a;因為線程池中的線程處于等待分配任…

探索鏈路追蹤在.NET6工業物聯網項目中的應用

如果覺得有用&#xff0c;請留言學到了。已經會了的老哥&#xff0c;請留言就這&#xff1f;可能遇到的問題工業物聯網系統自上而下一般分為ERP、Mes、SCADA、WCS、邊緣網關、設備等一個生產訂單從SAP發送到設備要經過上述多個系統&#xff0c;當某個環節出現問題&#xff0c;可…