Ehcacheの紹介

1概要

この記事では、広く使用されているオープンソースのJavaベースのキャッシュ、http://www.ehcache.org/[Ehcache]を紹介します。それはメモリとディスクストア、リスナー、キャッシュローダー、RESTfulとSOAP APIと他の非常に役に立つ機能を特徴とします。

キャッシングがどのように私たちのアプリケーションを最適化できるかを示すために、与えられた数の二乗値を計算する簡単な方法を作ります。各呼び出しで、メソッドは calculateSquareOfNumber(int number) methodを呼び出し、情報メッセージをコンソールに出力します。

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

私たちはEhcache自体(Springを除く)に完全に焦点を合わせていることに注意することが重要です。 EhcacheがSpringでどのように機能するのかを知りたい場合は、read この記事 をご覧ください。

2 Mavenの依存関係

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

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.1.3</version>
</dependency>

Ehcacheアーティファクトの最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.ehcache%22[here]にあります。

3キャッシュ構成

Ehcacheは2つの方法で設定できます。

  • 最初の方法は、すべての設定パラメータがあるJava POJOを使うことです。

Ehcache APIを介して構成されている ** 2番目の方法は、XMLファイルを介した設定です。

提供スキーマ定義 に従ってEhcacheを設定

この記事では、JavaとXML構成の両方のアプローチについて説明します。

3.1. Javaの設定

このサブセクションでは、POJOを使ってEhcacheを設定するのがどれほど簡単かを説明します。また、キャッシュ構成と可用性を容易にするためにヘルパークラスを作成します。

public class CacheHelper {

    private CacheManager cacheManager;
    private Cache<Integer, Integer> squareNumberCache;

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

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

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

   //standard getters and setters
}

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

キャッシュは単に Integer キーを Integer 値にマッピングします。

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

最後に、キャッシュを取得するために、 getCache() APIをキャッシュの提供された名前、キー、および値の型と共に使用することができます。

これらの数行で、最初のキャッシュを作成しました。これは現在アプリケーションで使用可能です。

3.2. XML設定

サブセクション4.1からの設定オブジェクト。このXML設定を使用することと同じです。

<cache-template name="squaredNumber">
    <key-type>java.lang.Integer</key-type>
    <value-type>java.lang.Integer</value-type>
    <heap unit="entries">10</heap>
</cache-template>

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

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

4エキャッシュテスト

セクション4では、目的に合わせて単純なキャッシュを定義する方法を示しました。キャッシュが実際に機能することを示すために、提供された入力の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<Integer, Integer> 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には非常に優れた機能(永続性やデータの有効期限など)があることも示しました。

いつものように、この記事のコードはhttps://github.com/eugenp/tutorials/tree/master/spring-all[on GitHub]にあります。