Java での LRU キャッシュの開発
このコンテキストでは、LRU (最も最近使用されていない) キャッシュは、最も最近使用されていないキャッシュであると仮定します。エントリは保持する値が少ないため、キャッシュ容量を維持するために必要な場合に破棄できます。 Java でこれを実現するには、次のアプローチを検討してみましょう。
1. LinkedHashMap と同期
Collections#synchronizedMap で LinkedHashMap を使用することについて言及しました。これは有効なアプローチであり、LinkedHashMap の組み込みの二重リンク リスト構造を利用して LRU の動作を維持し、同期によってマルチスレッド環境でキャッシュが保護されます。
2.同時コレクション
新しい同時コレクションはパフォーマンスが向上していますが、組み込みの LRU 機能がありません。したがって、LinkedHashMap のロジックを組み込んで ConcurrentHashMap を拡張すると、高度な同時実行 LRU 実装を提供できます。
現在の実装
提案を検討した結果、次のことを選択しました。現時点では、LinkedHashMap Collections.synchronizedMap アプローチを使用します。将来これを再検討する場合、ConcurrentHashMap を拡張することが実行可能なオプションになる可能性があります。
参考までに、現在の実装のスニペットを以下に示します。
<code class="java">private class LruCache<A, B> extends LinkedHashMap<A, B> { private final int maxEntries; public LruCache(final int maxEntries) { super(maxEntries + 1, 1.0f, true); this.maxEntries = maxEntries; } // Check if the cache exceeds its maximum size @Override protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) { return super.size() > maxEntries; } } Map<String, String> example = Collections.synchronizedMap(new LruCache<String, String>(CACHE_SIZE));</code>
このキャッシュは、removeEldestEntry メソッドを利用して最小限のものを削除します。キャッシュが最大サイズに達したときに最近使用されたエントリは、LRU の動作を維持します。
以上がJava で LRU キャッシュを実装する方法: LinkedHashMap と ConcurrentHashMap?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。