2011年7月16日土曜日

Javaで件数に上限のあるキャッシュの作成

Javaで件数に上限のあるキャッシュの作成ってどうやるのが普通なんだろうと
いろいろ調べてみる。
LinkedHashMapを利用するとすごく簡単にFIFOタイプLRUタイプのキャッシュが
簡単に出来ることがわかった。

FIFO…最初に入ったやつ(古いものから追い出す)タイプ
LRU…一番最後に利用されたものから追い出すタイプ

こんな簡単に実装できるとはびっくりした。

下記がサンプルです。

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

public class CacheSample {

 private static class FIFOCache<K,V> extends LinkedHashMap<K,V>{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private int maxEntries;
   public FIFOCache(int maxEntries) {
    super(maxEntries,(float) 0.75,false);
    this.maxEntries=maxEntries;
   }
   protected boolean removeEldestEntry(Entry<K,V> eldest) {
    return size()>maxEntries;
   }
 }
 private static class LRUCache<K,V> extends LinkedHashMap<K,V>{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private int maxEntries;
   public LRUCache(int maxEntries) {
    super(maxEntries,(float) 0.75,true);
    this.maxEntries=maxEntries;
   }
   protected boolean removeEldestEntry(Entry<K,V> eldest) {
    return size()>maxEntries;
   }
 }
 public static void main(String[] args) {
  System.out.println("FIFOの場合");
  //上限50個のFIFOキャッシュを作成
  FIFOCache<Integer,String> fifocache = new FIFOCache<Integer,String>(50);
  testCache(fifocache);
  System.out.println("LRUの場合");
  //上限50個のLRUキャッシュを作成
  LRUCache<Integer,String> lrucache = new LRUCache<Integer,String>(50);
  testCache(lrucache);

 }
 private static void testCache(LinkedHashMap<Integer,String> cache) {
  for (int i=0;i<50;i++){
   cache.put(new Integer(i), "HOGE"+i);
  }
  System.out.println(cache.get(new Integer(0)));
  for (int i=50;i<70;i++){
   cache.put(new Integer(i), "HOGE"+i);
  }
  if (cache.containsKey(new Integer(0))){
   System.out.println("0が残っている");
  }else{
   System.out.println("0が消えている");
  }  
 }
}

0 件のコメント: