LRUアルゴリズム
LRU(最も最近使用されていない)は、最も最近使用されていない。
LRUアルゴリズムのアイデア
最近のデータへのアクセスがない場合、今後アクセスされる可能性は低いと考えられます。
したがって、スペースがいっぱいになると、最も古い未使用のデータが最初に削除されます。
LRUアルゴリズムの説明
キャッシュ構造を設計します。構造は、サイズがKであると仮定して、サイズの構築で決定され、2つの機能があります。
-
put(key, value)
この構造にレコード(キー、値)を挿入します。キャッシュがいっぱいになると、最も古い未使用のデータが削除されます。 -
get(key)
キーに対応する値を返します。
LRUアルゴリズムの実装
-
最も単純なアイデアは、配列+タイムスタンプメソッドを使用することですが、これは効率が悪くなります。
-
二重リンクリスト(LinkedList)+ハッシュテーブル(HashMap)を使用して達成できます(リンクリストは場所を示すために使用され、ハッシュテーブルは保存と検索に使用されます)。
-
Javaのデータ構造を直接使用します
LinkedHashMap
。
LRUCache
package com.itplh;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author: tanpenggood
* @date: 2020-09-17 10:49
*/
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private int cacheSize;
public LRUCache(int cacheSize) {
// LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
// 关键:使用的三个参数的构造方法,将accessOrder设置为true,LinkedHashMap默认为false
super(16, (float) 0.75, true);
this.cacheSize = cacheSize;
}
/**
* 当缓存空间不够时,淘汰最久未使用的数据
*
*/
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > cacheSize;
}
}
LRUCacheTest
package com.itplh;
import lombok.extern.slf4j.Slf4j;
/**
* @author: tanpenggood
* @date: 2020-09-17 10:49
*/
@Slf4j
public class LRUCacheTest {
public static void main(String[] args) {
LRUCache<String, Integer> cache = new LRUCache<>(5);
for (int i = 1; i <= 5; i++) {
cache.put("k" + i, i);
}
log.info("all cache: {}", cache);
cache.get("k3");
log.info("get k3: {}", cache);
cache.get("k4");
log.info("get k4: {}", cache);
cache.get("k4");
log.info("get k4: {}", cache);
cache.put("k" + 10, 10);
log.info("After running the LRU algorithm cache: {}", cache);
}
}
出力
all cache: {
k1=1, k2=2, k3=3, k4=4, k5=5}
get k3: {
k1=1, k2=2, k4=4, k5=5, k3=3}
get k4: {
k1=1, k2=2, k5=5, k3=3, k4=4}
get k4: {
k1=1, k2=2, k5=5, k3=3, k4=4}
After running the LRU algorithm cache: {
k2=2, k5=5, k3=3, k4=4, k10=10}
総括する
- この要素からデータを最後まで取り出す意志から
cache
のそれぞれget
。 - スペースが最初のチーム(最近使用)の要素のうち、不足している場合、データ、最初の新しいデータは、尾に保存され、その後、十分なバッファ領域かどうかを判断します。
cache
put