第4章 エビクションおよびデータコンテナー
Red Hat Data Grid はエントリーのエビクションをサポートし、メモリーが不足しないようにします。通常、エビクションはキャッシュストアと併用されるため、エビクションはキャッシュストアまたは残りのクラスターからではなくメモリーからエントリーのみを削除し、エントリーがエビクトされると永続的に失われないようにします。
Red Hat Data Grid は、複数の異なる形式でデータの保存をサポートします。データはオブジェクト iself、バイナリーを byte[] として保存し、バイト[] をネイティブメモリーに保存する off-heap として保存できます。
パッシベーションはエビクションを使用する場合も一般的なオプションであり、メモリーまたはキャッシュストアのいずれかではなく、エントリーの単一コピーのみが維持されるようにします。通常のキャッシュストアでパッシベーションを使用する主な利点は、更新もキャッシュストアに対して行う必要がないため、メモリーに存在するエントリーへの更新が少なくなることです。
エビクションは ローカル ベースで行われ、クラスター全体には含まれません。各ノードはエビクションスレッドを実行してインメモリーコンテナーの内容を分析し、エビクトするかを決定します。エビクションは、エントリーのエビクトを開始するしきい値として JVM の空きメモリー容量を考慮しません。エビクションを有効にするには、エビクション要素の サイズ 属性をゼロよりも大きい値に設定する必要があります。サイズが大きすぎる場合は、メモリー不足になる可能性があります。各ユースケースで サイズ 属性を調整する必要がある場合があります。
4.1. エビクションの有効化
エビクションは、< memory /> 要素を <* -cache /> 設定セクションに追加するか、または MemoryConfigurationBuilder API プログラムによるアプローチを使用して設定します。
すべてのキャッシュエントリーは、キャッシュにヒットされるユーザースレッドのペクリーバックによってエビクトされます。
4.1.1. エビクションストラテジー
ストラテジーはエビクションの処理方法を制御します。
可能な選択肢は、
NONE
エビクションは有効ではなく、ユーザーがキャッシュで直接エビクトを呼び出しないことが想定されます。パッシベーションが有効な場合には、警告メッセージが出力されます。これはデフォルトのストラテジーです。
MANUAL
このストラテジーは <b>NONE</b> と同様になりますが、ユーザーが直接エビクトを呼び出すことを想定しています。パッシベーションが有効な場合は、警告メッセージがログに記録されません。
REMOVE
このストラテジーは実際には「古い」エントリーをエビクトし、着信するエントリーを収容します。
エビクションは、追加の受付ウィンドウで TinyLFU アルゴリズムを利用する Caffeine によって処理されます。これは、ヒット率が高くなり、メモリーオーバーヘッドが低いことが求められるため選択されました。これにより、LRU よりもヒット比率が改善されますが、LIRS よりも少ないメモリーも要求されます。
EXCEPTION
このストラテジーにより、ContainerFullException を発生させて新規エントリーが作成されるのを防ぎます。このストラテジーは、1 フェーズコミットまたは同期の最適化が許可されない 2 フェーズコミットで常に実行されるトランザクションキャッシュでのみ機能します。
4.1.2. エビクションタイプ
エビクションタイプは、サイズが 0 を超えるものに設定されている場合にのみ適用されます。以下のエビクションタイプは、コンテナーがエントリーの削除を決定するタイミングを決定します。
カウント
このタイプのエビクションは、キャッシュにあるものの数に基づいてエントリーを削除します。エントリーの数が サイズ よりも大きいと、部屋を作成するためにエントリーが削除されます。
MEMORY
このタイプのエビクションは、各エントリーがメモリーにかかる量を予測し、すべてのエントリーの合計サイズが設定 サイズ よりも大きい場合にエントリーを削除します。このタイプは、以下の OBJECT ストレージタイプとは機能しません。
4.1.3. ストレージタイプ
Red Hat Data Grid では、データを格納するフォームを設定できます。各フォームは Red Hat Data Grid と同じ機能をサポートしますが、エビクションはフォームによっては制限できます。現在、Red Hat Data Grid が提供するストレージフォーマットは 3 つあります。
オブジェクト
キーと値をオブジェクトとして Java heap Only COUNT エビクションタイプに保存します。
BINARY
キーと値を byte[] として Java ヒープに保存します。キャッシュ用に設定されたマーシャラーを使用します(存在する場合)。COUNT および MEMORY エビクションタイプの両方がサポートされます。
OFF-HEAP
キーと値をバイトとして Java ヒープ外のネイティブメモリーに保存します。キャッシュに 1 つある場合、設定されたマーシャラーが使用されます。COUNT および MEMORY エビクションタイプの両方がサポートされます。
BINARY および OFF-HEAP はいずれも、オブジェクトインスタンスの代わりに生成する結果として生成される byte[] によって指定される等価および hashCode に違反する。
4.1.4. その他のデフォルト値
デフォルトでは、< memory /> 要素が指定されていない場合、エビクションは実行されません。OBJECT ストレージタイプが使用され、NONE のストラテジーが想定されます。
メモリー要素がある場合、以下の表は、xml 設定(Supplied size または Supplied strategy 列の「-」)で提供される情報に基づいてエビクションの動作を記述します。
| 指定されたサイズ | 例 | エビクションの動作 |
|---|---|---|
| - |
| オブジェクトとしてエビクションがない |
| - |
| パッシベーションが有効な場合にはエビクションをオブジェクトとして記録せず、警告をログに記録しません。 |
| > 0 |
| エビクションは実行され、オブジェクトとして保存されます。 |
| > 0 |
| エビクションが行われ、バイナリー削除として保存され、メモリーオフェンスが 100 を超えないようにします。 |
| > 0 |
| エビクションが行われ、オフヒープに保存される |
| > 0 |
| エントリーはオフヒープに保存され、追加で 100 個のエントリーがコンテナー例外にあるとスローされます。 |
| 0 |
| エビクションなし |
| < 0 |
| エビクションなし |