LRU快取介紹與實現

2021-10-08 13:35:41 字數 2024 閱讀 4457

如何實現乙個lru呢?如果使用雙向鍊錶+hash實現。

首先需求清楚:

什麼是lru;

需要哪些支援知識;

怎麼使用這些基礎知識實現;

如果高併發下怎麼辦;

反思一些基礎知識。

什麼是lru:

就是最近最少訪問。

需要哪些支援知識:

那是不是就想起了linked。為什麼沒有使用linkedlist呢?而是使用linkedmaphash。

我覺得:

linkedmaphash:就是linkedlist+hashmap。  linkedlist用來維護順序,hashmap用來儲存資料。通過維護乙個執行於所有條目的雙向鍊錶,linkedhashmap保證了元素迭代的順序。該迭代順序可以是插入順序或者是訪問順序。

怎麼使用這些基礎知識實現

參考:

思路:可以順序查詢;

訪問不過是插入還是查詢都可以,該值自動放到第一位,後面的值自動後退移位;

怎麼做到上述點呢?如果使用linkedmaphash貌似一下就解決了。

linkedhashmap    accessorder設為true,按照訪問順序排序

但是如果讓自己實現呢?

public class lrucache   

/** 

* 獲取快取中物件,並把它放在最前面 

*/  

public entry get(object key)  else   

}  /** 

* 新增 entry到hashtable, 並把entry  

*/  

public void put(object key, object value)  else              

node = new entry();  

}  node.value = value;  

//將最新使用的節點放到煉表頭,表示最新使用的.  

movetohead(node);  

nodes.put(key, node);  

}  /** 

* 將entry刪除, 注意:刪除操作只有在cache滿了才會被執行 

*/  

public void remove(object key)   

if (node.next != null)   

if (last == node)  

last = node.prev;  

if (first == node)  

first = node.next;  

}  //在hashtable中刪除  

nodes.remove(key);  

}  /** 

* 刪除鍊錶尾部節點,即使用最後 使用的entry 

*/  

private void removelast()   

}  /** 

* 移動到煉表頭,表示這個節點是最新使用過的 

*/  

private void movetohead(entry node)   

first = node;  

node.prev = null;  

if (last == null)  

last = first;  

}  /* 

* 清空快取 

*/  

public void clear()   

}  class entry

思路就是:雙鏈表 + hashtable實現

為什麼要用hashtable呢?

我覺得還是hashmap也行。

在這個**中:雙向鍊錶是自定義的:

class entry {  

entry prev;//前一節點  

entry next;//後一節點  

object value;//值  

object key;//鍵  

主要核心邏輯是被當訪問後,需要將此值放到頭部。

實現**:movetohead

LRU快取替換演算法介紹與程式設計實現

快取中容量是有限的,當要查詢的資料不在快取中時,我們要用新資料替換掉 部分原有得資料,有很多種替換策略,lru就是最近最少使用的被替換,我們想要 將來被使用的資料保留下來,但我們不知道將來會使用那些資料,就按照最近使用資料近似將來也會使用的資料。我們要如何體現最近最少使用呢?採用乙個佇列,新加入的資...

LRU快取機制實現

題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key...

快取 LRU演算法實現

以下是基於雙向鍊錶 hashmap的lru演算法實現,對演算法的解釋如下 設定乙個map存放對應的鍵和值,同時設定乙個雙向鍊錶,來儲存最近最久未使用的關係,如果訪問乙個鍵,鍵存在於map中,訪問完成後,我們在鍊錶中將該鍵刪除,然後將其新增到鍊錶的首部,表示最近剛訪問過這個鍵,當快取滿了後,如果要新增...