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.判斷元素是否填滿到指定大小,如果...