概要
L2キャッシュの目的は、データベースにアクセスして情報を読み取ることなく、パフォーマンスを大幅に向上させることです。
たとえば、「IDによる検索」または「ユニークキーによる検索」クエリを実行する代わりに、EbeanにL2キャッシュで結果を効率的に検索させることができます。 _ニアキャッシング_を使用している場合、これは多くの場合、ローカルマップへのインメモリ検索となり、リモート呼び出しを必要としないため、非常に高速になります。
永続コンテキストはしばしば「レベル1キャッシュ」と呼ばれるため、「レベル2キャッシュ」と呼ばれます。
「L2キャッシュ」には、2つの主要なキャッシュ、「Beanキャッシュ」と「クエリキャッシュ」があります。
Beanキャッシュ
BeanキャッシュはエンティティBeanを保持し、それらの_ID_値、およびオプションで_自然キー_によってキーが設定されます。 Beanキャッシュは以下で使用できます。
- IDによる検索
- 自然キーによる検索
クエリキャッシュ
クエリキャッシュは、クエリの結果(エンティティBeanのリスト、セット、マップ、およびカウント)を保持し、クエリとそのバインド値のハッシュによってキーが設定されます。
クエリキャッシュのエントリは、基になるテーブルへの変更(挿入、更新、または削除)によって無効になります。 つまり、クエリキャッシュは、比較的変更頻度の低いエンティティ(通常は国、通貨、ステータスコードなどの「ルックアップテーブル」)でのみ役立ちます。
クエリキャッシュは以下で使用できます。
- リスト/セット/マップクエリを検索
結果整合性
Ebean L2キャッシングは、_結果整合性_を使用します。
これは、「レプリケーションラグ」のように動作することを意味します。 L2キャッシュから返されるデータは、(ミリ秒)古くなっている可能性があります。 変更は比較的短時間(ミリ秒)でキャッシュに加えられますが、トランザクションデータベースが提供する読み取り整合性は保証されません。
Ebean L2キャッシングでは、トランザクションの読み取り整合性を提供しようとしません。 アプリケーションの一部でトランザクションの読み取り整合性が必要な場合は、_データベースを使用して_それを行う必要があります。
無効化
Ebeanは、Beanが永続化されたとき、または更新クエリが実行されたときに、キャッシュを自動的に無効にします。
さらに、プログラムでキャッシュの一部を明示的に無効にすることができます。
バックグラウンド通知
デフォルトでは、EbeanはバックグラウンドでL2キャッシュの更新と無効化を実行します。 キャッシュの更新と無効化をフォアグラウンドで実行する場合は、`notifyL2CacheInForeground`をtrueに設定する必要があります。
ニアキャッシュ
Ebeanと同じプロセスで実行されるキャッシュは、_ニアキャッシュ_です。 ニアキャッシュに対するヒットの実行は、インメモリマップのルックアップであり、ネットワーク経由では行われません。 ニアキャッシュに対するヒットは非常に高速です。事実上、ローカルのインメモリマップget()です。
Redis、Hazelcast、およびIgnite用のEbean L2 Beanキャッシュにはすべて、ニアキャッシュオプションがあります。 これが有効になっている場合、最初に使用され、ヒットされるローカルのインプロセスキ ャッシュがあり、ニアキャッシュでミスが発生した場合にのみ、リクエストはリモートのRedis | Hazelcast | Igniteキャッシュに送られます。
たとえば、ニアキャッシュを有効にしたCustomerのBeanキャッシングでebean-redisを使用します。
@Cache(nearCache=true)
@Entity
public class Customer
- 最初にローカルのインメモリニアキャッシュにヒットし、ヒットした場合はCustomerを返します
- 次に、リモートRedisキャッシュにヒットし、ヒットした場合はCustomerを返します
- 3番目に、データベースにクエリを実行し、Customerを返し、Redisキャッシュとニアキャッシュもロードします
すべてのクエリキャッシュはニアキャッシュとしてのみ実装されていることに注意してください。
リージョン
「リージョン」を使用してキャッシュをグループ化し、「リージョングループ」ごとにL2キャッシングを有効または無効にできます。
これは、名前付きリージョンごとにL2キャッシュを「機能トグル」/有効化できるメカニズムを提供します。
アプリケーションがロールアウトされ、ProductのL2キャッシングを使用し(そのリージョンを「product-region」と呼びます)、さらに開発を進めて、PriceのL2キャッシングを使用したいが、すべての環境で有効にしたくないとします(例:本番環境では有効にしたくありません)。 開発環境とテスト環境では、l2キャッシュリージョン「product-region、price-region」を有効にすることができますが、本番環境では「product-region」のみを有効にします。
@Entity
@Cache(region = "product-region")
public class Product
enabledL2Regions
ebean.enabledL2Regions=product-region,price-region
設定
`DatabaseConfig`を介して設定できる設定オプション。
パラメータ | デフォルト | 説明 |
---|---|---|
disableL2Cache | false | L2キャッシュをグローバルに無効にするには、trueに設定します |
enabledL2Regions | 有効なL2キャッシュリージョンを設定します(コンマ区切り)。 デフォルトでは、すべてのリージョンが有効になっています。 | |
localOnlyL2Cache | false | L2キャッシュプラグイン(ebean-redis、ebean-hazelcastなど)を事実上無効にするには、trueに設定します |
notifyL2CacheInForeground | false | キャッシュ通知と無効化をフォアグラウンドで実行するには、trueに設定します。 通常、L2キャッシュ通知はバックグラウンドで実行し、トランザクションの実行パフォーマンスに影響を与えないようにします。 |
cacheMaxSize | 10000 | |
cacheMaxIdleTime | 10分 | |
cacheMaxTimeToLive | 6時間 | |
queryCacheMaxSize | 1000 | |
queryCacheMaxIdleTime | 10分 | |
queryCacheMaxTimeToLive | 6時間 |