Ehcacheの紹介

Ehcacheの概要

1. 概要

この記事では、広く使用されているオープンソースのJavaベースのキャッシュであるEhcacheを紹介します。 メモリおよびディスクストア、リスナー、キャッシュローダー、RESTfulおよびSOAP API、およびその他の非常に便利な機能を備えています。

キャッシングがアプリケーションを最適化する方法を示すために、提供された数値の二乗値を計算する簡単なメソッドを作成します。 呼び出しごとに、メソッドはcalculateSquareOfNumber(int number)メソッドを呼び出し、情報メッセージをコンソールに出力します。

この簡単な例では、二乗値の計算が1回だけ行われ、同じ入力値を持つ他のすべての呼び出しがキャッシュから結果を返すことを示したいと思います。

Ehcache自体(Springなし)に完全に焦点を合わせていることに注意することが重要です。 EhcacheがSpringでどのように機能するかを知りたい場合は、読み取りthis articleを参照してください。

2. Mavenの依存関係

Ehcacheを使用するには、このMaven依存関係を追加する必要があります。


    org.ehcache
    ehcache
    3.1.3

Ehcacheアーティファクトの最新バージョンはhereにあります。

3. キャッシュ構成

Ehcacheは2つの方法で構成できます。

  • 最初の方法は、すべての構成パラメーターがEhcache APIを介して構成されているJava POJOを使用することです

  • 2番目の方法は、provided schema definitionに従ってEhcacheを構成できるXMLファイルを介した構成です。

この記事では、JavaとXML構成の両方のアプローチを紹介します。

3.1. Java設定

このサブセクションでは、POJOを使用してEhcacheを簡単に構成する方法を示します。 また、キャッシュの構成と可用性を簡単にするヘルパークラスを作成します。

public class CacheHelper {

    private CacheManager cacheManager;
    private Cache squareNumberCache;

    public CacheHelper() {
        cacheManager = CacheManagerBuilder
          .newCacheManagerBuilder().build();
        cacheManager.init();

        squareNumberCache = cacheManager
          .createCache("squaredNumber", CacheConfigurationBuilder
            .newCacheConfigurationBuilder(
              Integer.class, Integer.class,
              ResourcePoolsBuilder.heap(10)));
    }

    public Cache getSquareNumberCacheFromCacheManager() {
        return cacheManager.getCache("squaredNumber", Integer.class, Integer.class);
    }

    // standard getters and setters
}

キャッシュを初期化するには、まず、EhcacheCacheManagerオブジェクトを定義する必要があります。 この例では、newCacheManagerBuilder() API.を使用してデフォルトのキャッシュsquaredNumber”を作成しています。

キャッシュは、IntegerキーをInteger値にマップするだけです。

定義されたキャッシュの使用を開始する前に、init()メソッドを使用してCacheManagerオブジェクトを初期化する必要があることに注意してください。

最後に、キャッシュを取得するには、キャッシュの指定された名前、キー、および値のタイプでgetCache()APIを使用できます。

これらの数行を使用して、アプリケーションで使用できるようになった最初のキャッシュを作成しました。

3.2. XML構成

サブセクション3.1の構成オブジェクト。 このXML構成を使用するのと同じです。


    java.lang.Integer
    java.lang.Integer
    10

そして、このキャッシュをJavaアプリケーションに含めるには、JavaでXML構成ファイルを読み取る必要があります。

URL myUrl = getClass().getResource(xmlFile);
XmlConfiguration xmlConfig = new XmlConfiguration(myUrl);
CacheManager myCacheManager = CacheManagerBuilder
  .newCacheManager(xmlConfig);

4. Ehcacheテスト

セクション3。 目的に合わせて単純なキャッシュを定義する方法を示しました。 キャッシュが実際に機能することを示すために、提供された入力の2乗値を計算するSquaredCalculatorクラスを作成し、計算された値をキャッシュに格納します。

もちろん、キャッシュに既に計算された値が含まれている場合、キャッシュされた値を返し、不要な計算を回避します。

public class SquaredCalculator {
    private CacheHelper cache;

    public int getSquareValueOfNumber(int input) {
        if (cache.getSquareNumberCache().containsKey(input)) {
            return cache.getSquareNumberCache().get(input);
        }

        System.out.println("Calculating square value of " + input +
          " and caching result.");

        int squaredValue = (int) Math.pow(input, 2);
        cache.getSquareNumberCache().put(input, squaredValue);

        return squaredValue;
    }

    //standard getters and setters;
}

テストシナリオを完了するには、二乗値を計算するコードも必要です。

@Test
public void whenCalculatingSquareValueAgain_thenCacheHasAllValues() {
    for (int i = 10; i < 15; i++) {
        assertFalse(cacheHelper.getSquareNumberCache().containsKey(i));
        System.out.println("Square value of " + i + " is: "
          + squaredCalculator.getSquareValueOfNumber(i) + "\n");
    }

    for (int i = 10; i < 15; i++) {
        assertTrue(cacheHelper.getSquareNumberCache().containsKey(i));
        System.out.println("Square value of " + i + " is: "
          + squaredCalculator.getSquareValueOfNumber(i) + "\n");
    }
}

テストを実行すると、コンソールに次の結果が表示されます。

Calculating square value of 10 and caching result.
Square value of 10 is: 100

Calculating square value of 11 and caching result.
Square value of 11 is: 121

Calculating square value of 12 and caching result.
Square value of 12 is: 144

Calculating square value of 13 and caching result.
Square value of 13 is: 169

Calculating square value of 14 and caching result.
Square value of 14 is: 196

Square value of 10 is: 100
Square value of 11 is: 121
Square value of 12 is: 144
Square value of 13 is: 169
Square value of 14 is: 196

お気づきのように、calculate()メソッドは最初の呼び出しでのみ計算を実行していました。 2回目の呼び出しで、すべての値がキャッシュで検出され、キャッシュから返されました。

5. その他のEhcache構成オプション

前の例でキャッシュを作成したとき、特別なオプションのない単純なキャッシュでした。 このセクションでは、キャッシュの作成に役立つ他のオプションを示します。

5.1. ディスクの永続性

キャッシュに格納するには値が多すぎる場合、それらの値の一部をハードドライブに格納できます。

PersistentCacheManager persistentCacheManager =
  CacheManagerBuilder.newCacheManagerBuilder()
    .with(CacheManagerBuilder.persistence(getStoragePath()
      + File.separator
      + "squaredValue"))
    .withCache("persistent-cache", CacheConfigurationBuilder
      .newCacheConfigurationBuilder(Integer.class, Integer.class,
        ResourcePoolsBuilder.newResourcePoolsBuilder()
          .heap(10, EntryUnit.ENTRIES)
          .disk(10, MemoryUnit.MB, true))
      )
  .build(true);

persistentCacheManager.close();

デフォルトのCacheManagerの代わりに、メモリに保存できないすべての値を保持するPersistentCacheManagerを使用するようになりました。

構成から、キャッシュによって10個の要素がメモリに保存され、永続化のためにハードドライブに10MBが割り当てられることがわかります。

5.2. データの有効期限

大量のデータをキャッシュする場合、大量のメモリ使用を回避できるように、キャッシュされたデータを一定期間保存するのは当然です。

Ehcacheは、Expiryインターフェースを介してデータの鮮度を制御します。

CacheConfiguration cacheConfiguration
  = CacheConfigurationBuilder
    .newCacheConfigurationBuilder(Integer.class, Integer.class,
      ResourcePoolsBuilder.heap(100))
    .withExpiry(Expirations.timeToLiveExpiration(Duration.of(60,
      TimeUnit.SECONDS))).build();

このキャッシュでは、すべてのデータが60秒間存続し、その期間が過ぎるとメモリから削除されます。

6. 結論

この記事では、Javaアプリケーションで単純なEhcacheキャッシングを使用する方法を示しました。

この例では、単純に構成されたキャッシュでも多くの不要な操作を節約できることがわかりました。 また、POJOとXMLを介してキャッシュを構成できること、およびEhcacheに永続性やデータの有効期限などの優れた機能があることを示しました。

いつものように、この記事のコードはon GitHubにあります。