Spring Bootでのキャッシュエビクション

Spring Bootのキャッシュエビクション

1. 概要

この短いチュートリアルでは、how we can perform cache eviction using Spring.を学習します。これを示すための小さな例を作成します。

先に進む前に、記事–Guide To Caching in Spring –をチェックして、Springキャッシュがどのように機能するかを理解してください。

2. キャッシュを削除する方法は?

Springは、メソッドで@CacheEvictアノテーションを使用するか、CacheMangerを自動配線し、clear()メソッドを呼び出してキャッシュをクリアすることにより、キャッシュを削除する2つの方法を提供します。

これら2つのキャッシュエビクションメカニズムをコードに実装する方法は次のとおりです。

2.1. @CacheEvictの使用

@CacheEvictアノテーションを使用して空のメソッドを作成し、アノテーションの引数としてクリアするキャッシュ名を指定しましょう(この場合、「first」という名前でキャッシュをクリアします)。

@CacheEvict(value = "first", allEntries = true)
public void evictAllCacheValues() {}

Spring will intercept all the methods annotated with @CacheEvict and clear all the values based on the allEntries flag。 特定のキーに基づいて値を削除することができます。

このために必要なのは、allEntriesフラグの代わりに、引数としてキャッシュキーをアノテーションに渡すことだけです。

@CacheEvict(value = "first", key = "#cacheKey")
public void evictSingleCacheValue(String cacheKey) {}

key属性の値は動的であるため、KeyGeneratorを実装して対象の引数またはネストされたプロパティを選択することにより、Spring式言語またはカスタムキージェネレーターを使用できます。

2.2. CacheManagerの使用

次に、Spring Cacheモジュールによって提供されるCacheManagerを使用して、キャッシュを削除する方法を見てみましょう。 まず、実装されたCacheManagerBeanを自動配線する必要があります。

そして、必要に応じてキャッシュをクリアできます:

@Autowired
CacheManager cacheManager;

public void evictSingleCacheValue(String cacheName, String cacheKey) {
    cacheManager.getCache(cacheName).evict(cacheKey);
}

public void evictAllCacheValues(String cacheName) {
    cacheManager.getCache(cacheName).clear();
}

コードでわかるように、the clear() method will clear all the cache entries and the evict() method will clear values based on a key

3. すべてのキャッシュを削除する方法は?

Springは、すべてのキャッシュをクリアするためのすぐに使用できる機能を提供していません。 ただし、キャッシュマネージャーのgetCacheNames()メソッドを使用すると、これを簡単に実現できます。

3.1. オンデマンドの立ち退き

次に、オンデマンドですべてのキャッシュをクリアする方法を見てみましょう。 トリガーポイントを作成するには、最初にエンドポイントを公開する必要があります。

@RestController
public class CachingController {

    @Autowired
    CachingService cachingService;

    @GetMapping("clearAllCaches")
    public void clearAllCaches() {
        cachingService.evictAllCaches();
    }
}

CachingServiceでは、次のことができます。clear all the caches by iterating over the cache names obtained from the cache manager

public void evictAllCaches() {
    cacheManager.getCacheNames().stream()
      .forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}

3.2. 自動エビクション

キャッシュエビクションを特定の間隔で自動的に実行する特定のユースケースがあります。 この場合、we can make use of the Spring’s task scheduler

@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {
    evictAllCaches();
}

4. 結論

さまざまな方法でキャッシュを削除する方法を学びました。 これらのメカニズムについて注目に値するものの1つは、eh-cache、infini-span、apache-igniteなどのさまざまなキャッシュ実装のすべてで機能することです。

いつものように、このチュートリアルで言及されているすべての例はover on Githubで見つけることができます。