[応用機能]キャッシュ

アプリケーション開発において、情報を一時的にキャッシュしておき、情報へのアクセスを高速にしたい場合があります。
また、キャッシュされたオブジェクトは、キャッシュ領域を圧迫し続けないように、一定の条件下でキャッシュから溢れてキャッシュアウトされる必要があります。

情報を集合的にキャッシュする機能を抽象化したのがCacheで、キーと値の集合でキャッシュする機能を抽象化したのがCacheMapです。
また、キャッシュから溢れてキャッシュアウトする機能を抽象化したのが、OverflowControllerで、その機能を、どれだけ溢れるかを検証するOverflowValidator、どれを溢れさせるかを決めるOverflowAlgorithm、どのように溢れさせるかを決めるOverflowActionに細分化しています。

関連するパッケージは、以下です。

アプリケーション向けインタフェース Cache

オブジェクトを集合的にキャッシュする事ができます。
APIとしては、java.util.Setとほぼ互換性のあるインタフェースとなっており、任意のオブジェクトを登録して、集合的に管理できます。

アプリケーション向けインタフェースCacheを使った簡単なアプリケーションのサンプルを示します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.service.cache.Cache;
  3. import jp.ossc.nimbus.service.cache.CachedReference;
  4. // Cacheを取得
  5. Cache cache = (Cache)ServiceManagerFactory.getServiceObject("Cache");
  6. // キャッシュして、キャッシュ参照を受け取る
  7. CachedReference ref = cache.add("hoge");
  8. // キャッシュ参照から値を取得する
  9. // キャッシュから溢れてキャッシュされている場合は、nullが返る
  10. System.out.println(ref.get());

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.cache.MemoryCacheServiceメモリ中にキャッシュする
jp.ossc.nimbus.service.cache.FileCacheServiceファイルにキャッシュする
jp.ossc.nimbus.service.cache.SerializedMemoryCacheService直列化してメモリ中にキャッシュする

アプリケーション向けインタフェース CacheMap

オブジェクトをキーに紐付けてマップ的にキャッシュする事ができます。
APIとしては、java.util.Mapを継承したインタフェースとなっており、任意のオブジェクトをキーに紐付けて登録して、集合的に管理できます。

アプリケーション向けインタフェースCacheMapを使った簡単なアプリケーションのサンプルを示します。

  1. import jp.ossc.nimbus.core.ServiceManagerFactory;
  2. import jp.ossc.nimbus.service.cache.CacheMap;
  3. import jp.ossc.nimbus.service.cache.KeyCachedReference;
  4. // CacheMapを取得
  5. CacheMap cache = (CacheMap)ServiceManagerFactory.getServiceObject("CacheMap");
  6. // キャッシュする
  7. cache.put("hoge", "fuga");
  8. // キャッシュから値を取得する
  9. // キャッシュから溢れてキャッシュされている場合は、nullが返る
  10. System.out.println(cache.get("hoge”));

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.cache.MemoryCacheMapServiceメモリ中にキャッシュする
jp.ossc.nimbus.service.cache.FileCacheMapServiceファイルにキャッシュする
jp.ossc.nimbus.service.cache.SerializedMemoryCacheMapService直列化してメモリ中にキャッシュする

キャッシュサービス向けインタフェース OverflowController

キャッシュサービス向けインタフェースOverflowControllerは、CacheCacheMapサービスに、あふれ制御機能を付加するサービスのインタフェースです。
ここでいう、あふれ制御機能とは、「どれだけ溢れるのか」、「どれが溢れるのか」、「どのように溢れるのか」の3つの機能を連携させる事を指し、それぞれOverflowValidatorOverflowAlgorithmOverflowActionインタフェースに委譲されます。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービスインタフェース用途
jp.ossc.nimbus.service.cache.Cacheあふれ制御機能を付加するために使用する。
jp.ossc.nimbus.service.cache.CacheMapあふれ制御機能を付加するために使用する。

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.cache.DefaultOverflowControllerServiceデフォルト実装

OverflowControllerサービス向けインタフェース OverflowValidator

OverflowControllerサービス向けインタフェースOverflowValidatorは、OverflowControllerサービスの、あふれ制御機能のうち、「どれだけ溢れるのか」を抽象化したインタフェースです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービスインタフェース用途
jp.ossc.nimbus.service.cache.OverflowControllerあふれ制御機能のうち、「どれだけ溢れるのか」を決めるために使用する。

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.cache.CacheSizeOverflowValidatorServiceキャッシュされているオブジェクトの数を閾値として溢れる数を決める。
jp.ossc.nimbus.service.cache.MemorySizeOverflowValidatorServiceヒープメモリ使用量を閾値として溢れる数を決める。
jp.ossc.nimbus.service.cache.CalculateMemorySizeOverflowValidatorServiceキャッシュされているオブジェクトのメモリ使用量(理論計算)を閾値として溢れる数を決める。
jp.ossc.nimbus.service.cache.TimeExpierOverflowValidatorServiceキャッシュされてから経過した時間を閾値として溢れる数を決める。

OverflowControllerサービス向けインタフェース OverflowAlgorithm

OverflowControllerサービス向けインタフェースOverflowAlgorithmは、OverflowControllerサービスの、あふれ制御機能のうち、「どれを溢れさせるのか」を抽象化したインタフェースです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービスインタフェース用途
jp.ossc.nimbus.service.cache.OverflowControllerあふれ制御機能のうち、「どれを溢れさせるのか」を決めるために使用する。

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.cache.FIFOOverflowAlgorithmServiceFirst In First Outで溢れるオブジェクトを決める。
jp.ossc.nimbus.service.cache.LFUOverflowAlgorithmServiceLeast Frequency Usedで溢れるオブジェクトを決める。
jp.ossc.nimbus.service.cache.LIFOOverflowAlgorithmServiceLast In First Outで溢れるオブジェクトを決める。
jp.ossc.nimbus.service.cache.LRUOverflowAlgorithmServiceLeast Recently Usedで溢れるオブジェクトを決める。

OverflowControllerサービス向けインタフェース OverflowAction

OverflowControllerサービス向けインタフェースOverflowActionは、OverflowControllerサービスの、あふれ制御機能のうち、「どのように溢れるのか」を抽象化したインタフェースです。

このインタフェースの実装サービスは、下位サービスで、以下の上位サービスから使用します。

上位サービスインタフェース用途
jp.ossc.nimbus.service.cache.OverflowControllerあふれ制御機能のうち、「どのように溢れるのか」を決めるために使用する。

実装サービスの一覧は以下のとおりです。

実装サービス実装概要
jp.ossc.nimbus.service.cache.RemoveOverflowActionServiceキャッシュから削除する。
jp.ossc.nimbus.service.cache.StoreCacheOverflowActionService二次キャッシュに退避する。
jp.ossc.nimbus.service.cache.SoftReferenceOverflowActionServiceソフト参照に変えて、二次キャッシュに退避する。
jp.ossc.nimbus.service.cache.ContextSaveOverflowActionServiceコンテキストの永続化機能を使って、永続化を行い、キャッシュから削除する。

サンプルは、以下。