Spring Bootのデフォルトキャッシュ

Spring は、一般的に使用される 3 つのアノテーション、@Cacheable、@CachePut、@CacheEvict を提供します。

1. @Cacheable、@CachePut、@CacheEvict の違い
キャッシュを使用する場合、Spring は一般的に使用される 3 つのアノテーション、@Cacheable、@CachePut、@CacheEvict を提供します。それらの違いは次のとおりです:

@Cacheable アノテーション:

機能: メソッドの戻り値をキャッシュし、次回同じメソッドを呼び出したときに結果をキャッシュから直接取得できるようにします。

使用シナリオ: 読み取り操作が頻繁に行われるが、データがほとんど変更されないシナリオに適しています。

サンプルコード:

@Cacheable(value = "products", key = "#productId") 
public Product getProductById(Long productId) {
    
     
// 从数据库中获取产品信息 
}

上記の例では、 @Cacheable アノテーションを使用して getProductById メソッドの戻り値をキャッシュしており、キャッシュ名は「products」です。このメソッドが呼び出されるたびに、対応する結果がキャッシュに存在する場合は、キャッシュされた値が直接返されます。そうでない場合は、メソッド ロジックが実行され、結果がキャッシュに配置されます。

@CachePut アノテーション:

機能: メソッドの戻り値をキャッシュに更新します。

使用シナリオ: 結果をキャッシュに入れ、キャッシュされたデータが最新であることを確認する必要がある書き込みまたは更新操作に適しています。

サンプルコード:

@CachePut(value = "products", key = "#product.id") 
public Product saveProduct(Product product) {
    
     
// 保存产品信息到数据库 return product; 
}

上記の例では、 @CachePut アノテーションを使用して saveProduct メソッドの戻り値をキャッシュに入れており、キャッシュ名は「products」です。このメソッドが呼び出されるたびに、対応する値がキャッシュに存在するかどうかに関係なく、メソッドのロジックが実行され、結果がキャッシュ内で更新されます。

@CacheEvict アノテーション:

機能: 1 つ以上のキャッシュ項目をキャッシュから削除します。

使用シナリオ: 削除またはデータ更新後のキャッシュのクリーニングに適しています。

サンプルコード:

@CacheEvict(value = "products", key = "#productId") 
public void deleteProduct(Long productId) {
    
     
// 从数据库中删除产品信息
 }

上記の例では、@CacheEvict アノテーションを使用して deleteProduct メソッドが実行された後、キャッシュ内の指定された productId を持つキャッシュ項目が削除され、キャッシュ名は「products」になります。

2. 高度な使用
@Cacheable、@CachePut、@CacheEvict アノテーションの高度な使用に関する注意事項と高度な使用法は次のとおりです。

複数のキャッシュ マネージャーのサポート: アプリケーションで複数のキャッシュ マネージャーが使用されている場合、cacheManager 属性を使用して特定のキャッシュ マネージャーを指定できます。

@Cacheable(value = "products", key = "#productId", cacheManager = "cacheManager1") 
public Product getProductById(Long productId) {
    
     // ... }

条件付きキャッシュ: SpEL 式を使用してアノテーションの条件を定義でき、キャッシュ操作は条件が満たされた場合にのみ発生します。

@Cacheable(value = "products", key = "#productId", condition = "#productId > 0") 
public Product getProductById(Long productId) {
    
     // ... }

カスタム キャッシュ戦略: CacheResolver インターフェイスを実装するか、cacheResolver 属性を使用することにより、キャッシュの解析および管理ロジックをカスタマイズできます。

@Cacheable(value = "products", key = "#productId", cacheResolver = "customCacheResolver") 
public Product getProductById(Long productId) {
    
     // ... }

キャッシュ更新のタイミング: @CachePut アノテーションを使用すると、メソッドが呼び出されるたびにキャッシュを更新するのではなく、メソッドの実行後にキャッシュ更新を手動でトリガーできます。

@CachePut(value = "products", key = "#product.id") 
public Product updateProduct(Product product) {
    
     // ... return product; }

キャッシュクリア戦略: @CacheEvict アノテーションを使用すると、beforeInvocation 属性を通じてキャッシュをクリアするタイミングを制御できます。デフォルトでは、メソッドの実行後にキャッシュがクリアされます。

@CacheEvict(value = "products", key = "#productId", beforeInvocation = true) 
public void deleteProduct(Long productId) {
    
     // ... }

キャッシュ アノテーションの継承: アノテーションの継承を使用すると、同じキャッシュ アノテーションを複数のメソッドに適用する操作を簡素化できます。

@Inherited @Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@Cacheable(value = "products", key = "#productId") 
public @interface CachedProduct {
    
    
 // ...
  }

@CachedProduct 
public Product getProductById(Long productId) {
    
     
   // ...
    } 
@CachedProduct 
public List<Product> getAllProducts() {
    
    
     // ...
      }

カスタム キャッシュ キー生成戦略: keyGenerator 属性を使用してカスタム キャッシュ キー ジェネレーターを指定できます。

@Cacheable(value = "products",
 keyGenerator = "customKeyGenerator") 
 public Product getProductById(Long productId) {
    
    
  // ... }

SpEL 式の使用: SpEL 式をアノテーションの属性値で使用して、キャッシュ キーや条件などを動的に計算できます。

@Cacheable(value = "products", key = "'product:' + #productId") 
public Product getProductById(Long productId) {
    
     
// ...
 }

キャッシュ アノテーションの優先順位: メソッドで複数のキャッシュ アノテーションが同時に使用される場合、それらの実行順序と優先順位は @Order アノテーションによって制御できます。

@Cacheable(value = "products", key = "#productId") 
@CachePut(value = "products", key = "#productId") 
@Order(1) 
public Product getProductById(Long productId) {
    
     // ... }

キャッシュの有効期限を構成する: キャッシュ マネージャーの構成を使用してキャッシュの有効期限を設定したり、expiration 属性を使用して注釈でキャッシュの有効期限を指定したりできます。

@Configuration 
@EnableCaching 
public class CacheConfig extends CachingConfigurerSupport {
    
     
// ... 
@Override public CacheManager cacheManager() 
{
    
     
SimpleCacheManager cacheManager = new SimpleCacheManager(); 
// 设置缓存过期时间
 cacheManager.setCaches(Arrays.asList( new ConcurrentMapCache("products", getExpirationDuration(30)), 
 // ...
  )); 
  return cacheManager; 
  } 
  private Duration getExpirationDuration(int minutes) {
    
    
   return Duration.ofMinutes(minutes);
    } } 
    @Cacheable(value = "products", key = "#productId", expiration = 10) public Product getProductById(Long productId) {
    
    
     // ... 
     }

キャッシュ条件の判定: アノテーションにSpEL式を指定するcondition属性を使用して、条件に基づいてキャッシュ操作を実行するかどうかを判定できます。

@Cacheable(value = "products",
 key = "#productId", condition = "#productId > 0")
 public Product getProductById(Long productId) {
    
     // ... }

同期キャッシュ操作: @CachePut アノテーションを使用して同期キャッシュ操作を実装します。つまり、最初にメソッドを実行してからキャッシュを更新します。

@CachePut(value = "products", key = "#product.id") 
public Product updateProduct(Product product) {
    
     
// ... return product; }

キャッシュクリア戦略: @CacheEvict アノテーションを使用してキャッシュ内のデータをクリアでき、クリアするキャッシュ項目は key 属性を通じて指定できます。

@CacheEvict(value = "products", key = "#productId") 
public void deleteProduct(Long productId) {
    
    
 // ... 
 }

キャッシュ アノテーションの順序: メソッドに複数のキャッシュ アノテーションが存在する場合、@CacheConfig アノテーションまたは @Order アノテーションを使用して、アノテーションの実行順序を制御できます。

@CacheConfig(cacheNames = "products") 
public class ProductRepository {
    
     
@Cacheable(key = "#id") 
@CachePut(key = "#result.id") 
public Product getProductById(Long id) {
    
     
// ... 
} }

SpEL 式の使用: アノテーションで SpEL 式を使用して、キャッシュ キーを動的に生成できます。

@Cacheable(value = "products", key = "'product:' + #productId") 
public Product getProductById(Long productId) {
    
    
 // ... 
 }

キャッシュとトランザクション管理: キャッシュ アノテーションを使用する場合は、トランザクション管理との相互作用に注意する必要があります。デフォルトでは、Spring のトランザクション管理は、データの一貫性を確保するためにメソッドの実行前にキャッシュをクリアします。トランザクションがコミットされた後にキャッシュ操作を実行する場合は、 @CachePut アノテーションを使用してメソッドを新しいトランザクションに配置できます。

@Transactional public void updateProduct(Product product) {
    
    
 // 更新数据库中的数据 
 // ... 
 // 手动执行缓存操作
  updateProductCache(product); 
  } 
  @CachePut(value = "products", key = "#product.id") @Transactional(propagation = Propagation.REQUIRES_NEW) 
  public Product updateProductCache(Product product) {
    
     
  // 更新缓存中的数据 
  // ... 
  return product;
   }

マルチレベルキャッシュ構成: 1次キャッシュをローカルキャッシュとして使用し、2次キャッシュを分散キャッシュとして使用するなど、複数レベルのキャッシュを構成できます。 @CacheConfig アノテーションと CacheManager を通じて設定できます。

@CacheConfig(cacheNames = "products") 
public class ProductRepository {
    
     
@Autowired private CacheManager cacheManager; 
@Cacheable(key = "#id", cacheManager = "localCacheManager") 
public Product getProductById(Long id) {
    
    
 
 // ... 
 } 
 @Cacheable(key = "#id", cacheManager = "distributedCacheManager") public Product getProductByIdFromDistributedCache(Long id) {
    
     
 // ...
  } }

キャッシュの予熱: アプリケーションの起動時に特定のメソッドを呼び出してキャッシュ データをプリロードし、システムのパフォーマンスと応答速度を向上させることができます。

@Component public class CachePreloader 
{
    
     
@Autowired private ProductRepository productRepository; 
@PostConstruct public void preloadCache() {
    
    
 List<Product> products = productRepository.getAllProducts(); for (Product product : products) {
    
     productRepository.getProductById(product.getId()); 
 } } }

非同期キャッシュ操作: 非同期メソッドを使用してキャッシュ操作を実行すると、メインスレッドへの影響が軽減され、システムの同時実行パフォーマンスが向上します。

@CachePut(value = "products", key = "#product.id") 
@Async 
public CompletableFuture<Product> updateProductAsync(Product product) {
    
     // ... 
return CompletableFuture.completedFuture(product);
 }

上記は、@Cacheable、@CachePut、および @CacheEvict アノテーションをより適切に使用してキャッシュを管理し、特定のビジネス ニーズとシナリオに従ってキャッシュを最適化および構成するのに役立つ高度な使用法と注意事項です。実際の状況に応じて適切な使用法を選択し、キャッシュ フレームワークとキャッシュ マネージャーのドキュメントに基づいて綿密な調査と調整を行ってください。

3. 概要
@Cacheable アノテーションは、同じ入力パラメータを使用した後続の呼び出しのパフォーマンスを向上させるためにメソッドの結果をキャッシュする必要があることを示すために使用されます。まず結果がキャッシュに存在するかどうかを確認し、存在する場合はキャッシュ内の値を直接返し、存在しない場合はメソッドを実行して結果をキャッシュに保存します。キャッシュ キーを設定することで、さまざまなキャッシュ アイテムを区別できます。

@CachePut アノテーションは、メソッドの結果をキャッシュする必要があることを示すために使用されますが、メソッドは毎回実行され、結果がキャッシュに保存されます。@Cacheable のように結果がキャッシュに既に存在するかどうかは確認されません。これは、キャッシュ内のデータを更新して、キャッシュされたデータがデータベースまたは他のデータ ソースと確実に同期されるようにするためによく使用されます。

@CacheEvict アノテーションは、メソッドの実行後にキャッシュ内の特定の項目をクリアする必要があることを示すために使用されます。キャッシュ キーを設定することで、クリアする特定のキャッシュ項目を指定できます。また、すべてのキャッシュされた項目をクリアしたり、メソッドの実行前にキャッシュをクリアしたりするための allEntries や beforeInvocation などのプロパティも提供します。

これらのアノテーションは、Spring Boot のデフォルトのキャッシュ プロバイダーである Caffeine、Ehcache、Redis などのさまざまなキャッシュ プロバイダーと統合できます。これらのアノテーションを適切に使用すると、アプリケーションのパフォーマンスと応答性が大幅に向上します。

Supongo que te gusta

Origin blog.csdn.net/weixin_45817985/article/details/135035216
Recomendado
Clasificación