LRU的簡單實現

2021-10-23 06:47:47 字數 1173 閱讀 8952

lru是常用的快取淘汰策略。快取的「熱度」可以看作是沒有訪問該快取的時間,所以會維護乙個有序列表,每次訪問快取時,將訪問的快取移動到最前面。當超過容量限制後,刪除最久沒有被訪問的。

lru有一些問題,比如如果某個快取只是偶爾被訪問,那也可能再某個情況下,它恰好之前剛被訪問一次,導致他不會被刪除。所以有改進的方法lfu,lfu還會維護訪問次數。

redis中使用的是近似的lru,因為lru會造成大量的空間消耗。redis通過維護前一次訪問時間,每次隨機選擇幾個,刪除最久未被訪問的,重複取樣知道滿足記憶體要求。

通過leetcode 146,簡單實現一下:

linkedlist + hashmap

class

lrucache

public

intget

(int key)

else

}public

void

put(

int key,

int value)

else

} list.

addfirst

(key)

; map.

put(key,value);}

}/**

* your lrucache object will be instantiated and called as such:

* lrucache obj = new lrucache(capacity);

* int param_1 = obj.get(key);

* obj.put(key,value);

*/

linkedhashmap:快了很多

class

lrucache

extends

linkedhashmap

public

intget

(int key)

public

void

put(

int key,

int value)

@override

protected

boolean

removeeldestentry

(map.entry

eldest)

}

LRU簡單實現

lru的設計原理就是,當資料在最近一段時間經常被訪問,那麼它在以後也會經常被訪問。這就意味著,如果經常訪問的資料,我們需要然其能夠快速命中,而不常訪問的資料,我們在容量超出限制內,要將其淘汰。主要使用linkedhashmap簡單實現lru演算法效果 public class lrucache ex...

Lru快取的簡單實現

最近最少使用演算法設計的map快取 使用linkedhashmap特性,完成當快取超過指定容量時,擠掉最久未使用的資源。具體編寫的工具類如下 一 cache類 繼承linkedhashmap 用於儲存資料 class cache extends linkedhashmap 取得元素耗費儲存空間大小 ...

簡單實現演算法LRU

lru的主要思想基本是,設定乙個固定大小的容器,不斷新增元素。當容器放滿時,把最前面的元素清除,在對尾新增新元素,如果元素是重複的元素,則找出那個元素放到隊尾。lru演算法主要步驟是 1.判斷新元素的key是否在lru中,如果在,就把此元素找出來然後拿到鍊錶尾部 2.判斷元素是否填滿到指定大小,如果...