JAVA實現LRU算法

2020-11-18 IT職場技能亮點

最近面了阿里的外包吧,居然也要在線敲代碼了,那叫一個緊張啊。題目就是實現一個LRU算法的緩存。外包居然要求也這麼高了,哎。還好,LRU是我大學老師布置的一道題目,當然我用C語言實現的,算法原理那是一清二楚,可是面試的時候就腦子一片空白了。好在,邊敲代碼,邊思考,就慢慢想起來了,下面是我的代碼。拉勾IT課程小編為大家分解:

/**

* 設計和構建一個「最近最少使用」LRU 緩存,該緩存會刪除最近最少使用的項目。

* 緩存應該從鍵映射到值(允許你插入和檢索特定鍵對應的值),並在初始化時指定最大容量。

* 當緩存被填滿時,它應該刪除最近最少使用的項目。

* 考慮多線程操作下的操作安全和性能。

*/

public class LRUCache{


private int maxSize;


/**

* 存儲緩存數據

*/

private ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>();


/**

**存儲緩存key列表

*/

private LinkedList<String> list;


LRUCache(){

}


LRUCache(int maxSize){

this.maxSize = maxSize;

this.list = new LinkedList<>(maxSize);

}


/**

* @param key 緩存key

@return 緩存值

*/

synchronized Object getVal(String key){

//1.從map裡取數據

Object obj = map.get(key);


//2.將key置於list的尾部(表示最近被訪問過了)

if(obj != null){

addOrRefreshKey(key);

}

}


synchronized void putVal(String key,Object val){

//1.設置val到map中


//2.將key置於list的尾部(表示最近被訪問過了)


//3.需要做判斷是否list.size()>maxSize。如果滿了就刪除頭部(最近最少使用)的數據後再執行1-2步驟

}


/**

* 添加或刷新key

*/

private void addOrRefreshKey(String key){

this.list.remove(key); //管他三七二十一,先刪除掉

this.list.add(key); //然後添加這個可以,保證key置於list的尾部

}


}



相關焦點

  • LRU算法
    java實現LRU的方式基於LRU的基礎思想,本文整理三種實現方式List方案package pers.ascend.kukii.core.interview.algorithm.LRU算法.List;import org.apache.commons.lang3.RandomStringUtils;import java.io.Serializable;import java.time.Duration;import
  • 「Redis源碼分析」Redis中的LRU算法實現
    因為緩存是否可能被訪問到沒法做預測,所以基於如下假設實現該算法:如果一個key經常被訪問,那麼該key的idle time應該是最小的。(但這個假設也是基於概率,並不是充要條件,很明顯,idle time最小的,甚至都不一定會被再次訪問到)這也就是LRU的實現思路。
  • 從零開始手寫 redis(八)樸素 LRU 淘汰算法性能優化
    前言java從零手寫實現redis(一)如何實現固定大小的緩存?java從零手寫實現redis(三)redis expire 過期原理java從零手寫實現redis(三)內存數據如何重啟不丟失?java從零手寫實現redis(四)添加監聽器java從零手寫實現redis(五)過期策略的另一種實現思路java從零手寫實現redis(六)AOF 持久化原理詳解及實現我們前面簡單實現了 redis 的幾個特性,java從零手寫實現redis(一)如何實現固定大小的緩存? 中實現了先進先出的驅除策略。
  • 從零開始手寫 redis(九)LRU 緩存淘汰避免緩存汙染
    前言java從零手寫實現redis(一)如何實現固定大小的緩存?java從零手寫實現redis(三)redis expire 過期原理java從零手寫實現redis(三)內存數據如何重啟不丟失?java從零手寫實現redis(四)添加監聽器java從零手寫實現redis(五)過期策略的另一種實現思路java從零手寫實現redis(六)AOF 持久化原理詳解及實現java從零手寫實現redis(七)LRU 緩存淘汰策略詳解從零開始手寫 redis(八)樸素 LRU 淘汰算法性能優化前兩節我們分別實現了 LRU
  • 地鐵五分鐘理解LRU算法
    LRU(Least recently used,最近最少使用)算法作為內存管理的一種有效算法,其含義是在內存有限的情況下,當內存容量不足時,為了保證程序的運行,這時就不得不淘汰內存中的一些對象,釋放這些對象佔用的空間,那麼選擇淘汰哪些對象呢?
  • LRU原理和Redis實現——一個今日頭條的面試題
    基於 HashMap 和 雙向鍊表實現 LRU 的整體的設計思路是,可以使用 HashMap 存儲 key,這樣可以做到 save 和 get key的時間都是 O(1),而 HashMap 的 Value 指向雙向鍊表實現的 LRU 的 Node 節點,如圖所示。LRU 存儲是基於雙向鍊表實現的,下面的圖演示了它的原理。
  • Hash 一致性算法的 Java 實現
    一致性hash算法,可以用在分布式緩存、資料庫的分庫分表、負載均衡算法等場景中節點import java.util.HashMap;import java.util.Map;/** * Created by weiyuan on 2020/07/06 */public class Node {
  • 手寫一下 LRU 代碼實現?
    手寫一下 LRU 代碼實現?面試官心理分析如果你連這個問題都不知道,上來就懵了,回答不出來,那線上你寫代碼的時候,想當然的認為寫進 redis 的數據就一定會存在,後面導致系統各種 bug,誰來負責?常見的有兩個問題:往 redis 寫入的數據怎麼沒了?
  • Java實現冒泡排序算法
    學習方法推薦:#學習方法1.從基礎開始,系統化學習2.多動手,每一種數據結構與算法,都自己用代碼實現出來3.思路更重要:理解實現思想,不要背代碼4.與日常開發結合,對應應用場景從這一篇開始,我們把每一種排序算法,從算法的思想,到代碼實現都做一個分享。那麼你準備好了嗎?我們這一篇的主角是:冒泡排序#考考你:1.你知道冒泡排序的核心思想嗎?
  • 「日拱一卒」鍊表——如何實現lru
    LRURedis的內存淘汰機制好幾種,如ttl、random、lru。lru(less recently used)即最近最少使用策略,表示在最近一段時間內最少被使用到的Redis鍵,如果遇到內存不足,會有限淘汰這部分鍵來騰出更多空間。
  • Hanlp分詞實例:Java實現TFIDF算法
    算法介紹最近要做領域概念的提取,TFIDF作為一個很經典的算法可以作為其中的一步處理。計算公式比較簡單,如下:預處理由於需要處理的候選詞大約後3w+,並且語料文檔數有1w+,直接挨個文本遍歷的話很耗時,每個詞處理時間都要一分鐘以上。
  • 怎麼實現的延時隊列?以及訂閱模式、LRU
    Redis實現消息隊列和延時隊列消息隊列Redis的實現消息隊列可以用list來實現,通過lpush與rpop或者rpush與lpop結合來實現消息隊列。另外一點,就是Redis實現的消息隊列,沒有ACK機制,所以想要實現消息的可靠性,還要自己實現當消息處理失敗後,能繼續拋回隊列。延時隊列用Redis實現延時隊列,其實就是使用zset來實現,將消息序列化成一個字符串(可以是json格式),作為為value,消息的到期處理時間做為score,然後用多線程去輪詢zset來獲取到期消息進行處理。
  • LRU緩存算法的實現
    LRU就是Least Recently Used,即最近最少使用,是一種常用的頁面置換算法LRU是一種常見的頁面置換算法,在計算中,所有的文件操作都要放在內存中進行,然而計算機內存大小是固定的,所以我們不可能把所有的文件都加載到內存,因此我們需要制定一種策略對加入到內存中的文件進行選擇。
  • Java 七種排序算法以及實現
    最近學習一些排序算法,怕自己以後忘記就打算整理起來供自己複習萌新一枚學習Java沒多久,以下僅供參考。如有錯誤希望大佬指正,歡迎大家在評論區交流探討。>第一趟排序是從array[0]到array[array.length-1]找到一個最小值array[n]與array[0]進行交換,第一趟排序是從array[1]到array[array.length-1]找到一個最小值array[n]與array[1]進行交換,直到排序完成選擇排序每一趟排序會確定一個最小值(默認從小到大)以下是三種不同的代碼實現
  • 手寫最簡單的LRU算法
    因此 LRU 算法會根據數據的歷史訪問記錄來進行排序,如果空間不足,就會淘汰掉最近最少使用的數據。2 LRU 實現原理由於 LRU 算法會將最近使用的數據優先級上升,因此需要數據結構支持排序,鍊表非常合適。為什麼不考慮數組呢?
  • 了解LRU緩存的實現方法,這就夠了
    在之前的文章,我們介紹過常用緩存淘汰算法(文末有連結)。常見的緩存淘汰算法有先進先出淘汰算法(FIFO),最近最少使用淘汰算法(LSU),最近最久未使用算法(LRU),MRU(最近最常使用算法)。今天我們來討論其中的一種,也是最常用的LRU算法,看看它是如何實現的。
  • 簡單的java實現滑動時間窗口限流算法
    在網上搜滑動時間窗口限流算法,大多都太複雜了,本人實現了個簡單的,先上代碼:import java.time.LocalTime;import java.util.ArrayList;import java.util.List;import java.util.Map
  • 10行Java代碼實現最近被使用(LRU)緩存
    10行Java代碼實現最近被使用(LRU)緩存 據我所知,很少有一種程式語言的標準庫中有通用的數據結構能提供上述功能的。這是一種混合的數據結構,我們需要在哈希表的基礎上建立一個鍊表。但是 Java已經為我們提供了這種形式的數據結構-LinkedHashMap!
  • 如何使用鍊表實現 LRU 算法
    什麼是 LRU 算法LRU 是一種緩存淘汰策略。計算機的緩存容量有限,如果緩存滿了就要刪除一些內容,給新的內容騰位置。但是要刪除哪些內容呢?我們肯定希望刪掉那些沒有用的緩存,而把有用的數據繼續留在緩存中,方便之後繼續使用。
  • 使用Python的lru_cache秒殺大量動態規劃問題
    一、前言動態規劃,可以說是算法中最常見最困難的問題了,在大廠校招的筆試中,很多小夥伴經常因此卡在筆試環節裡,沒機會參與面試階段,實在可惜。而筆試作為一個機械的刷人階段,我們不應該在此被淘汰,使用好 Python 獨特的 api,即可輕鬆應對動態規劃問題了。