日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/4 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是LRU算法?

redis大家都玩過吧,你們好奇redis內(nèi)存數(shù)據(jù)存滿之后會發(fā)生什么嗎?拋出異常?禁止使用?還是刪除數(shù)據(jù)?其實(shí)redis設(shè)計(jì)了一種內(nèi)潤淘汰機(jī)制。

noeviction(默認(rèn)策略):屏蔽寫操作,返回錯(cuò)誤(特殊的寫操作除外),但是支持刪除操作

volatile-lru:使用LRU算法對設(shè)置了過期時(shí)間的key進(jìn)行刪除。

allkeys-lru:使用LRU算法對所有key進(jìn)行刪除。

allkeys-random:在所有的key中隨即淘汰一部分?jǐn)?shù)據(jù)。

volatile-ttl:根據(jù)過期時(shí)間刪除key,越快過期,就會被優(yōu)先執(zhí)行刪除操作。

volatile-random:在設(shè)置了過期時(shí)間的key中隨機(jī)淘汰一部分?jǐn)?shù)據(jù)。

使用命令查看redis的淘汰機(jī)制:

config get maxmemory-policy

看到?jīng)]有,其中就有一種LRU算法,那LRU到底是什么呢?最近最少使用的就被淘汰(刪除),這樣說比較抽象,我舉個(gè)現(xiàn)實(shí)中的例子:假如你買了一個(gè)衣柜,用來存放衣服,又因?yàn)槟闫綍r(shí)比較喜歡剁手,買著買著發(fā)現(xiàn)衣服太多了,衣柜放不下了,房間有沒有其他空間存放,這個(gè)時(shí)候是不是就需要將衣柜里面的某些衣服送給朋友或者丟掉呢?那你處理哪些衣服呢?你是不是會處理掉不怎么穿,并且買了很久的衣服,不會將你昨天買的就處理掉吧,LRU也是這樣,他會保留最近被使用的,刪除之前最少被使用的數(shù)據(jù)。

數(shù)組實(shí)現(xiàn)一個(gè)簡單的LRU算法

實(shí)現(xiàn)思路:1.創(chuàng)建一個(gè)指定長度的數(shù)組。2.判斷數(shù)組是否已被完全使用,如果沒有直接將數(shù)據(jù)添加數(shù)組末尾。3.如果數(shù)組已經(jīng)被完全使用,判斷此數(shù)據(jù)在數(shù)組中書否存在,如存在:將此數(shù)據(jù)移到數(shù)組末尾,其他數(shù)據(jù)往前移一位;如不存在,刪除數(shù)組第一位,然后將數(shù)組后面的數(shù)據(jù)往前移一位,最后將數(shù)據(jù)添加到數(shù)組的末尾。

請看代碼:

/** * 判斷數(shù)據(jù)是否存在數(shù)組中 * @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; } /** * 使用數(shù)組實(shí)現(xiàn)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("請輸入數(shù)據(jù):"); 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("沒有在數(shù)組中找到數(shù)據(jù)"); //數(shù)組中找不到數(shù)據(jù) //所有數(shù)據(jù)左移一位 for (int i = 1; i < length; i++) { arr[i - 1] = newArr[i]; } arr[length - 1] = str; } else { //System.out.println("在數(shù)組中找到了數(shù)據(jù),下標(biāo)在:"+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; } } //打印結(jié)果 for (int i = 0; i < length; i++) { if (i == (length - 1)) { System.out.print(arr[i]); } else { System.out.print(arr[i] + ","); } } } }

請看結(jié)果:

這樣,用數(shù)組實(shí)現(xiàn)一個(gè)簡單的LRU就完成了,當(dāng)然,你可以使用集合,還會更簡單。

使用鏈表的集合實(shí)現(xiàn)LRU算法

思路:1.判斷集合是否完全被使用,如果沒有,將數(shù)據(jù)添加到集合的末尾。2.如果集合空間已被完全使用,判斷數(shù)據(jù)在幾何中是否出現(xiàn)過,若沒有:刪除集合中的第一個(gè)元素,將數(shù)據(jù)添加到集合末尾;如果存在,刪除存在的元素,然后再將數(shù)據(jù)添加到集合末尾。代碼實(shí)現(xiàn):

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("這是用鏈表集合實(shí)現(xiàn)的LRU================="); while (true){ System.out.println(""); System.out.println("請輸入數(shù)據(jù):"); 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); } } /** * 獲取第一個(gè)元素 * @param map * @param * @param * @return */ public static Map.Entry getHead(Map map) { return map.entrySet().iterator().next(); }}

結(jié)果如下:

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。