solr入門の設計独自のJavaローカルキャッシュツールクラス


前回設計したキャッシュは粗いテンプレートにすぎず、メモリオーバーフローのリスクがあり、今日はローカルキャッシュクラスを再構築することを学びました(サイズを設定できます)
今回のキャッシュクラスはLURアルゴリズム+LinkedHashMapを用いて実現する.
LRUはLeast Recently Usedが最近最も使用しているアルゴリズムです.
メモリ管理のページ置換アルゴリズムで、メモリに使用されないデータブロック(内蔵ブロック)をLRUと呼び、オペレーティングシステムは、どのデータがLRUに属しているかに基づいてメモリから移動して別のデータをロードします.
LRUアルゴリズムとは?LRUはLeast Recently Usedの略で、ページ置換アルゴリズムを最小限に抑え、仮想ページストレージ管理サービスを提供しています.
オペレーティングシステムのメモリ管理については,容量の少ないメモリをどのように節約して最も多くのプロセスにリソースを提供するかが研究の重要な方向である.メモリの仮想ストレージ管理は、現在最も一般的で、最も成功した方法です.メモリが限られている場合、一部の外部メモリを仮想メモリとして拡張し、本当のメモリは現在の実行時に使用された情報だけを格納します.これはメモリの機能を大幅に拡張し、コンピュータの同時性を大幅に向上させたに違いない.仮想ページストレージ管理は、プロセスに必要なスペースを複数のページに分割し、メモリに現在必要なページのみを格納し、残りのページを外部メモリに格納する管理方式です.
LinkedHashMap自体は既にシーケンスストレージを実現しており、デフォルトでは要素の追加順に格納されているが、アクセス順に格納することも可能である.すなわち、最近読み込んだデータを一番前に、一番早く読み込んだデータを一番後ろに、そして一番古いデータを削除するかどうかを判断する方法があり、デフォルトではfalseに戻り、つまりデータを削除しない.LinkedHashMapを使用してLRUキャッシュを実現する方法はLinkedHashMapに対して簡単な拡張を実現することであり、拡張方式は2種類あり、1つはinheritanceであり、1つはdelegationであり、具体的にどのような方法で個人の好みを見るか
今回参考にしたのはinheritanceの方式が最後に別の実現のリンクが参考になることです
package cn.com.mx.gome.suggest.cache;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * lur           
 * @author songqinghu
 *
 */
public class LURCache<K,V> extends LinkedHashMap<K, V> {
    
    private final int MAX_CACHE_SIZE ;

    public  LURCache(int cacheSize){
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
        MAX_CACHE_SIZE = cacheSize;
    }
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > MAX_CACHE_SIZE;
    }
    
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<K, V> entry : entrySet()) {
            sb.append(String.format(" %s: %s ", entry.getKey(),entry.getValue()));
        }
        return sb.toString();
    }
    
}
package cn.com.mx.gome.suggest.cache;

import java.util.Collections;
import java.util.Map;

/**
 * solr      
 * @author songqinghu
 *
 */
public class WordLURCache {

    private static  Map<String,Integer> mapCache 
    = Collections.synchronizedMap(new LURCache<String,Integer>(50000));//                 
    
    
    public static Map<String,Integer> getWordCache(){
        return mapCache;
    }
    
    
    
    
    
}

参考資料:
http://www.cnblogs.com/lzrabbit/p/3734850.html