SpringBoot-@ Cacheable、@ CacheEvict、@ CachePut

Springは3.1以降、キャッシュのサポートを導入しました。その使用方法と原理は、Springのトランザクション管理サポートと似ています。Spring Cacheはメソッドで機能し、その中心となる考え方は次のとおりです。キャッシュメソッドを呼び出すと、メソッドのパラメーターと返された結果がキーと値のペアとしてキャッシュに保存され、次に同じパラメーターを使用してこのメソッドが呼び出されると、メソッドは実行されなくなりますが、結果はキャッシュから直接取得されて返されます。したがって、Spring Cacheを使用するときは、キャッシュされたメソッドが同じメソッドパラメーターに対して同じ戻り結果を返すようにする必要があります。

Spring Cacheを使用するには、次の2つのことを行う必要があります。

  1. キャッシュを使用する特定のメソッドを宣言する
  2. Springのキャッシュのサポートを構成する

Springのトランザクション管理のサポートと同様に、SpringのCacheのサポートも注釈とXMLベースの構成に基づいています。まず、アノテーションベースのアプローチを見てみましょう。

 

注釈ベースのサポート

Springは、Spring Cacheをサポートするいくつかのアノテーションを提供します。そのコアは主に@Cacheableと@CacheEvictです。@Cacheableでマークされたメソッドは実行後に返された結果をキャッシュし、@ CacheEvictでマークされたメソッドはメソッドの実行前または実行後にSpring Cacheの一部の要素を削除します。以下では、キャッシュのアノテーションサポートに基づいて、Springによって提供されるいくつかのアノテーションを詳しく紹介します。

 

1、@キャッシュ可能

@Cacheableは、メソッドまたはクラスでマークできます。メソッドでマークされている場合、そのメソッドはキャッシュをサポートしていることを意味し、クラスでマークされている場合、このクラスのすべてのメソッドがキャッシュをサポートしていることを意味します。キャッシュをサポートするメソッドの場合、Springは呼び出された後に戻り値をキャッシュします。次回同じパラメーターを使用してメソッドを実行するときに、メソッドを再度実行しなくても、キャッシュから直接結果を取得できます。Springは、メソッドの戻り値をキーと値のペアでキャッシュします。値は、メソッドの戻り結果です。キーについては、Springはデフォルトの戦略とカスタム戦略の2つの戦略をサポートしています。これについては後で説明します。キャッシングをサポートするメソッドがオブジェクト内で呼び出された場合、キャッシング機能はトリガーされないことに注意してください。@Cacheableは、値、キー、条件の3つの属性を指定できます。

1.1 value属性はキャッシュ名を指定します

value属性を指定する必要があります。これは、キャッシュの名前に対応して、現在のメソッドの戻り値がキャッシュされるキャッシュを示します。1つのキャッシュまたは複数のキャッシュにすることができます。複数のキャッシュを指定する必要がある場合は配列です。

@Cacheable("cache1") // Cache是发生在cache1上的
public User find(Integer id) {
  returnnull;
}

@Cacheable({"cache1", "cache2"}) // Cache是发生在cache1和cache2上的
public User find(Integer id) {
  returnnull;
}

1.2 key属性を使用してキーをカスタマイズする

key属性は、Springキャッシュメソッドが結果を返すときに対応するキーを指定するために使用されます。この属性はSpringEL式をサポートします。この属性を指定しない場合、Springはデフォルトの戦略を使用してキーを生成します。デフォルトの戦略については後で別途紹介するので、ここでカスタム戦略を見てみましょう。

カスタム戦略とは、SpringのEL式を通じてキーを指定できることを意味します。ここでEL式はメソッドパラメータとそれに対応する属性を使用できます。メソッドパラメータを使用する場合、「#パラメータ名」または「#pパラメータインデックス」を直接使用できます。以下は、パラメータをキーとして使用するいくつかの例です。

/**
* key 是指传入时的参数
*
*/

@Cacheable(value="users", key="#id")
public User find(Integer id) {
  return null;
}

// 表示第一个参数
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
  return null;
}

// 表示User中的id值
@Cacheable(value="users", key="#user.id")
public User find(User user) {
  return null;
}

// 表示第一个参数里的id属性值
@Cacheable(value="users", key="#p0.id")
public User find(User user) {
  return null;
}

上記のメソッドパラメータをキーとして使用することに加えて、Springはキーの生成に使用できるルートオブジェクトも提供します。このルートオブジェクトを通じて、次の情報を取得できます。

ルートオブジェクトの属性をキーとして使用する場合、Springはデフォルトでルートオブジェクトの属性を使用するため、「#root」を省略することもできます。など:

// key值为: user中的name属性的值
@Cacheable(value={"users", "xxx"}, key="caches[1].name")
public User find(User user) {
  return null;
}

1.3 condition属性は、発生する条件を指定します

メソッドから返されたすべての結果をキャッシュしたくない場合があります。この機能は、condition属性を介して実現できます。条件属性はデフォルトでは空で、すべての呼び出し状況がキャッシュされることを示します。値はSpringEL式で指定されます。trueの場合はキャッシュ処理を行うことを意味し、falseの場合はキャッシュ処理を行わないこと、つまりメソッドが呼び出されるたびにメソッドが実行されることを意味します。次の例は、ユーザーのIDが偶数の場合にのみキャッシュが実行されることを示しています。

// 根据条件判断是否缓存
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
public User find(User user) {
  System.out.println("find user by user " + user);
  return user;
}

 

2 @CachePut

Springキャッシュをサポートする環境では、@ Cacheableでマークされたメソッドについて、Springは各実行前にキャッシュ内に同じキーを持つキャッシュ要素があるかどうかをチェックします。存在する場合、メソッドは実行されず、キャッシュから直接取得されます。結果が返されます。それ以外の場合は実行され、返された結果は指定されたキャッシュに格納されます。@CachePutは、キャッシュ機能をサポートするメソッドを宣言することもできます。@Cacheableとの違いは、@ CachePutでマークされたメソッドは、実行前にキャッシュに以前に実行された結果があるかどうかをチェックせず、毎回メソッドを実行し、キーと値のペアの形式で実行結果を保存することです。指定されたキャッシュ。

// @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。
@CachePut("users") // 每次都会执行方法,并将结果存入指定的缓存中
public User find(Integer id) {
  return null;
}

 

3 @CacheEvict

@CacheEvictは、キャッシュ要素をクリアする必要があるメソッドまたはクラスをマークするために使用されます。クラスにマークされている場合、それはクラス内のすべてのメソッドの実行がキャッシュのクリア操作をトリガーすることを意味します。@CacheEvictで指定できる属性は、value、key、c​​ondition、allEntries、およびbeforeInvocationです。値、キー、条件のセマンティクスは、@ Cacheableの対応する属性に似ています。つまり、値は、クリア操作が発生したキャッシュ(キャッシュの名前に対応)を示します。キーは、クリアする必要があるキーを示します。指定されていない場合は、デフォルトの方法で生成されたキーが使用されます。条件は、クリア操作が発生する条件を示します。新しく登場した2つの属性allEntriesとbeforeInvocationを紹介しましょう。

3.1 allEntries属性

allEntriesはブール型で、キャッシュ内のすべての要素をクリアする必要があるかどうかを示します。デフォルトはfalseで、これは必要がないことを意味します。allEntriesがtrueに指定されている場合、Spring Cacheは指定されたキーを無視します。すべての要素をクリアするためにキャッシュする必要がある場合があります。これは、要素を1つずつクリアするよりも効率的です。

@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {
  System.out.println("delete user by id: " + id);
}

3.2 beforeInvocation属性

デフォルトでは、対応するメソッドが正常に実行された後にクリア操作がトリガーされます。つまり、例外をスローしたためにメソッドが返されなかった場合、クリア操作はトリガーされません。beforeInvocationを使用すると、クリア操作をトリガーする時間を変更できます。この属性の値をtrueに指定すると、Springはこのメソッドを呼び出す前に、キャッシュ内の指定された要素をクリアします。

@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {
  System.out.println("delete user by id: " + id);
}

実際、@ CacheEvictを使用してキャッシュ要素をクリアすることに加えて、Ehcacheを実装として使用する場合は、Ehcache独自の排除戦略を構成することもできます。これは、Ehcache構成ファイルで指定されます。Ehcacheはこの記事の焦点では​​ないので、ここでは詳しく説明しません。Ehcacheの詳細については、Ehcacheに関する私のコラムを確認してください。

 

4 @キャッシング

@Cachingアノテーションを使用すると、メソッドまたはクラスに複数のSpring Cache関連のアノテーションを同時に指定できます。これにはcacheable、put、evictの3つの属性があり、それぞれ@ Cacheable、@ CachePut、@ CacheEvictを指定するために使用されます。

@Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
@CacheEvict(value = "cache3", allEntries = true) })
public User find(Integer id) {
  return null;
}

 

5カスタムアノテーションを使用する

Springでは、カスタムアノテーションに対応するアノテーションを付ける必要がある場合、キャッシュ可能なメソッドを構成するときにカスタムアノテーションを使用できます。たとえば、@ Cacheableでマークされた次のカスタムアノテーションがあります。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Cacheable(value="users")
public @interface MyCacheable {}

次に、@ MyCacheableを使用して、キャッシュする必要があるメソッドにラベルを付けても、同じ効果が得られます。

@MyCacheable
public User findById(Integer id) {
  System.out.println("find user by id: " + id);
  User user = new User();
  user.setId(id);
  user.setName("Name" + id);
  return user;
}

元の記事952件を公開 1820年に賞賛 89万回の閲覧

おすすめ

転載: blog.csdn.net/Dream_Weave/article/details/105415161