JavaはどのようにLRUキャッシュを実現します(最近最も少ない使用)
2004 ワード
LRUはLeast Recently Usedの略で、翻訳すると「最近最も少ない使用」です.LRUキャッシュはこの原理を使って実現されています.簡単に言えば、一定量のデータをキャッシュし、設定したしきい値を超えると、期限切れのデータを削除します.例えば、10000個のデータをキャッシュし、10000個未満のデータを勝手に追加することができます.10000を超えると、新しいデータを追加する必要があります.同時に、期限切れのデータを削除して、私たちが最大10000個のキャッシュを確保する必要があります.では、どの期限切れのデータを削除するかをどのように確定しますか.LRUアルゴリズムを採用して実現すれば、最も古いデータを削除することです.くだらないことは多くありません.次のJava版のLRUキャッシュを実現します.
LinkedHashMapによる実装
LinkedHashMap自体は既にシーケンスストレージを実現しており、デフォルトでは要素の追加順に格納されているが、アクセス順に格納することも可能である.すなわち、最近読み込んだデータを一番前に、一番早く読み込んだデータを一番後ろに、そして一番古いデータを削除するか否かを判断する方法
テスト
https://www.cnblogs.com/lzrabbit/p/3734850.html
LinkedHashMapによる実装
LinkedHashMap自体は既にシーケンスストレージを実現しており、デフォルトでは要素の追加順に格納されているが、アクセス順に格納することも可能である.すなわち、最近読み込んだデータを一番前に、一番早く読み込んだデータを一番後ろに、そして一番古いデータを削除するか否かを判断する方法
removeEldestEntry
があり、デフォルトではfalseに戻り、つまりデータを削除しない.LinkedHashMapを使用してLRUキャッシュを実装する方法は、LinkedHashMapに対して簡単な拡張を実装し、この方法を書き換えることです.package cn.lzrabbit.structure.lru;
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache2 extends LinkedHashMap {
private final int MAX_CACHE_SIZE;
public LRUCache2(int cacheSize) {
////LinkedHashMap , accessOrder true , , ,
super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
MAX_CACHE_SIZE = cacheSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_CACHE_SIZE;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Map.Entry entry : entrySet()) {
sb.append(String.format("%s:%s ", entry.getKey(), entry.getValue()));
}
return sb.toString();
}
}
テスト
package com.cachelru;
public class Main {
public static void main(String[] args) {
Cache cache = new Cache(4);
for (int i = 0; i < 6; i++) {
cache.put(i, ""+i);
cache.get(i+1);
}
System.out.println(cache.toString());
}
}
https://www.cnblogs.com/lzrabbit/p/3734850.html