5.3. Data Grid キャッシュを使用したエビクション
エビクションを使用すると、以下の 2 つの方法のいずれかでメモリーからエントリーを削除して、データコンテナーのサイズを制御できます。
-
エントリーの合計数 (
max-count
)。 -
メモリーの最大量 (
max-size
)。
エビクションは、一度に 1 つのエントリーをデータコンテナーから破棄し、そのエントリーが実行するノードに対してローカルにあります。
エビクションはメモリーからエントリーを削除しますが、永続的なキャッシュストアからは削除しません。Data Grid がエビクトした後もエントリーが利用可能な状態を維持し、データの一貫性を防ぐためには、永続ストレージを設定する必要があります。
memory
を設定する場合、Data Grid はデータコンテナーの現在のメモリー使用量を概算します。エントリーが追加または変更されると、Data Grid はデータコンテナーの現在のメモリー使用量を最大サイズと比較します。サイズが最大値を超えると、Data Grid はエビクションを実行します。
エビクションは、最大サイズを超えるエントリーを追加するスレッドですぐに行われます。
5.3.1. エビクションストラテジー
Data Grid エビクションを設定する場合は、以下を指定します。
- データコンテナーの最大サイズ。
- キャッシュがしきい値に達するとエントリーを削除するストラテジー。
エビクションは手動で実行することも、Data Grid を以下のいずれかを実行するように設定したりできます。
- 古いエントリーを削除して、新しいエントリー用の領域を作成します。
ContainerFullException
を出力し、新規エントリーが作成されないようにします。例外エビクションストラテジーは、2 フェーズコミットを使用するトランザクションキャッシュでのみ動作しますが、1 フェーズコミットまたは同期の最適化とは関係しません。
エビクションストラテジーについての詳細は、スキーマ参照を参照してください。
Data Grid には、TinyLFU と呼ばれる Least Frequently Used (LFU) キャッシュ置換アルゴリズムのバリエーションを実装する Caffeine キャッシングライブラリーが含まれています。オフヒープストレージの場合、Data Grid は LeastRecent Used (LRU) アルゴリズムのカスタム実装を使用します。
5.3.2. 最大カウントエビクションの設定
Data Grid キャッシュのサイズをエントリーの合計数に制限します。
手順
- Data Grid 設定を開いて編集します。
-
Data Grid が
max-count
属性またはmaxCount()
メソッドのいずれかでエビクションを実行する前のキャッシュに含まれるエントリーの合計数を指定します。 以下のいずれかをエビクションストラテジーとして設定し、Data Grid が
when-full
属性またはwhenFull()
メソッドを持つエントリーを削除する方法を制御します。-
REMOVE
Data Grid はエビクションを実行します。これはデフォルトのストラテジーです。 -
MANUAL
組み込みキャッシュのエビクションを手動で実行します。 -
EXCEPTION
Data Grid は、エントリーをエビクトするのではなく、例外を出力します。
-
- Data Grid 設定を保存して閉じます。
最大数エビクション
以下の例では、キャッシュに合計 500 エントリーが含まれ、新しいエントリーが作成されると、Data Grid はエントリーを削除します。
XML
<distributed-cache> <memory max-count="500" when-full="REMOVE"/> </distributed-cache>
JSON
{ "distributed-cache" : { "memory" : { "max-count" : "500", "when-full" : "REMOVE" } } }
YAML
distributedCache: memory: maxCount: "500" whenFull: "REMOVE"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.memory().maxCount(500).whenFull(EvictionStrategy.REMOVE);
5.3.3. 最大サイズのエビクションの設定
Data Grid キャッシュのサイズを最大メモリー容量に制限します。
手順
- Data Grid 設定を開いて編集します。
application/x-protostream
をキャッシュエンコーディングのメディアタイプとして指定します。最大サイズのエビクションを使用するには、バイナリーメディアタイプを指定する必要があります。
-
Data Grid が
max-size
属性またはmaxSize()
メソッドでエビクションを実行する前にキャッシュが使用できるメモリーの最大量 (バイト単位) を設定します。 任意で、測定のバイト単位を指定します。
デフォルトは B(バイト単位) です。サポートされるユニットの設定スキーマを参照してください。
以下のいずれかをエビクションストラテジーとして設定し、Data Grid が
when-full
属性またはwhenFull()
メソッドを持つエントリーのいずれかを削除する方法を制御します。-
REMOVE
Data Grid はエビクションを実行します。これはデフォルトのストラテジーです。 -
MANUAL
組み込みキャッシュのエビクションを手動で実行します。 -
EXCEPTION
Data Grid は、エントリーをエビクトするのではなく、例外を出力します。
-
- Data Grid 設定を保存して閉じます。
最大サイズのエビクション
以下の例では、キャッシュのサイズが 1.5 GB(ギガバイト) に達すると、Data Grid はエントリーを削除します。
XML
<distributed-cache> <encoding media-type="application/x-protostream"/> <memory max-size="1.5GB" when-full="REMOVE"/> </distributed-cache>
JSON
{ "distributed-cache" : { "encoding" : { "media-type" : "application/x-protostream" }, "memory" : { "max-size" : "1.5GB", "when-full" : "REMOVE" } } }
YAML
distributedCache: encoding: mediaType: "application/x-protostream" memory: maxSize: "1.5GB" whenFull: "REMOVE"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.encoding().mediaType("application/x-protostream") .memory() .maxSize("1.5GB") .whenFull(EvictionStrategy.REMOVE);
5.3.4. 手動エビクション
手動エビクションストラテジーを選択する場合、Data Grid はエビクションを実行しません。これは、evict()
メソッドで手動で行う必要があります。
組み込みキャッシュでのみ手動のエビクションを使用する必要があります。リモートキャッシュの場合は、REMOVE
または EXCEPTION
エビクションストラテジーで Data Grid を常に設定する必要があります。
この設定は、パッシベーションを有効にし、エビクションを設定しない場合に警告メッセージを防ぎます。
XML
<distributed-cache> <memory max-count="500" when-full="MANUAL"/> </distributed-cache>
JSON
{ "distributed-cache" : { "memory" : { "max-count" : "500", "when-full" : "MANUAL" } } }
YAML
distributedCache: memory: maxCount: "500" whenFull: "MANUAL"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.encoding().mediaType("application/x-protostream") .memory() .maxSize("1.5GB") .whenFull(EvictionStrategy.REMOVE);
5.3.5. エビクションによるパッシベーション
パッシベーションは、Data Grid がエントリーをエビクトする際にキャッシュストアにデータを永続化します。以下の例のように、エビクションをパッシベーションを有効にする場合は、常にエビクションを有効にする必要があります。
XML
<distributed-cache> <persistence passivation="true"> <!-- Persistent storage configuration. --> </persistence> <memory max-count="100"/> </distributed-cache>
JSON
{ "distributed-cache": { "memory" : { "max-count" : "100" }, "persistence" : { "passivation" : true } } }
YAML
distributedCache: memory: maxCount: "100" persistence: passivation: "true"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.memory().maxCount(100); builder.persistence().passivation(true); //Persistent storage configuration