JavaはどのようにLRUキャッシュを実現します(最近最も少ない使用)

2004 ワード

LRUはLeast Recently Usedの略で、翻訳すると「最近最も少ない使用」です.LRUキャッシュはこの原理を使って実現されています.簡単に言えば、一定量のデータをキャッシュし、設定したしきい値を超えると、期限切れのデータを削除します.例えば、10000個のデータをキャッシュし、10000個未満のデータを勝手に追加することができます.10000を超えると、新しいデータを追加する必要があります.同時に、期限切れのデータを削除して、私たちが最大10000個のキャッシュを確保する必要があります.では、どの期限切れのデータを削除するかをどのように確定しますか.LRUアルゴリズムを採用して実現すれば、最も古いデータを削除することです.くだらないことは多くありません.次のJava版のLRUキャッシュを実現します.
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