lrucache
什麼是lrucache?
lrucache實現原理是什麼?
這兩個問題其實可以作為乙個問題來回答,知道了什麼是 lrucache,就只然而然的知道 lrucache 的實現原理;lru的全稱是least recently used ,近期最少使用的!所以我們可以推斷出 lrucache 的實現原理:把近期最少使用的資料從快取中移除,保留使用最頻繁的資料,那具體**要怎麼實現呢,我們進入到原始碼中看看。
public
class lrucache
this.maxsize = maxsize;
this.map = new linkedhashmap(0, 0.75f, true);
}//重置最大快取的值
public
void
resize(int maxsize)
synchronized (this)
trimtosize(maxsize);
}//通過 key 獲取快取值
public final v get(k key)
v mapvalue;
synchronized (this)
misscount++;
}//如果沒有,使用者可以去建立
v createdvalue = create(key);
if (createdvalue == null)
synchronized (this) else
}//這裡沒有移除,只是改變了位置
if (mapvalue != null) else
}//新增快取,跟上面這個方法的 create 之後的**一樣的
public final v put(k key, v value)
v previous;
synchronized (this)
}if (previous != null)
trimtosize(maxsize);
return previous;
}//檢測快取是否越界
private
void
trimtosize(int maxsize)
//如果沒有,則返回
if (size <= maxsize)
//以下**表示已經超出了最大範圍
map.entrytoevict = null;
for (map.entryentry : map.entryset())
if (toevict == null)
//移除最後乙個,也就是最少使用的快取
key = toevict.getkey();
value = toevict.getvalue();
map.remove(key);
size -= safesizeof(key, value);
evictioncount++;
}entryremoved(true, key, value, null);}}
//手動移除,使用者呼叫
public final v remove(k key)
v previous;
synchronized (this)
}if (previous != null)
return previous;
}//這裡使用者可以重寫它,實現資料和記憶體**操作
protected
void
entryremoved(boolean evicted, k key, v oldvalue, v newvalue) {}
protected v create(k key)
private
intsafesizeof(k key, v value)
return result;
}//這個方法要特別注意,跟我們例項化 lrucache 的 maxsize 要呼應,怎麼做到呼應呢,比如 maxsize 的大小為快取的個數,這裡就是 return 1就 ok,如果是記憶體的大小,如果5m,這個就不能是個數 了,這是應該是每個快取 value 的 size 大小,如果是 bitmap,這應該是 bitmap.getbytecount();
protected
intsizeof(k key, v value)
//清空快取
public final void
evictall()
public synchronized final int
size()
public synchronized final int
maxsize()
public synchronized final int
hitcount()
public synchronized final int
misscount()
public synchronized final int
createcount()
public synchronized final int
putcount()
public synchronized final int
evictioncount()
public synchronized final mapsnapshot()
}
1、lrucache 是基於 lru演算法實現的一種快取機制;
2、lru演算法的原理是把近期最少使用的資料給移除掉,當然前提是當前資料的量大於設定的最大值。
3、lrucache 沒有真正的釋放記憶體,只是從 map中移除掉資料,真正釋放記憶體還是要使用者手動釋放。
LRU cache原理及go實現
1.1 概述 快取資源通常比較昂貴,通常資料量較大時,會竟可能從較少的快取滿足盡可能多訪問,這裡有一種假設,通常最近被訪問的資料,那麼它就有可能會被後續繼續訪問,基於這種假設,將所有的資料按訪問時間進行排序,並按驅逐出舊資料,那麼存在快取的資料就為熱點資料,這樣既節省了記憶體資源,又極大的滿足了訪問...
LRu Cache演算法原理
lru cache演算法原理 1.新資料插入到鍊錶頭部 2.每當快取命中 即快取資料被訪問 則將資料移到鍊錶頭部 3.當鍊表滿的時候,將鍊錶尾部的資料丟棄。分析 命中率 當存在熱點資料時,lru的效率很好,但偶發性的 週期性的批量操作會導致lru命中率急劇下降,快取汙染情況比較嚴重。複雜度 實現簡單...
談談LruCache演算法的底層實現原理及其內部原始碼
我們在對資料進行操作的時候,為了避免流量或者效能的消耗,我們對於一些資料都會進行快取處理,而對資料的快取的要點不僅僅只有我們所熟悉的儲存快取和使用快取,還有刪除快取。對於新增和獲取快取很好理解,那麼為什麼還要對快取進行刪除吶?原因很簡單,因為我們的手機容量是有限的,如果我們拼命的寫入快取,那麼終有一...