【SpringCache】SpringCacheの詳しい説明と使い方、Redisの有効期限制御

1. 使用する

Spring でのキャッシュの使用には通常、次の手順が含まれます。

1. キャッシュの依存関係を追加する: キャッシュ関連の依存関係がプロジェクトに追加されていることを確認します。Maven を使用する場合は、プロジェクトの pom.xml ファイルに Spring Cache の依存関係を追加できます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2. キャッシュの設定: Spring 設定ファイルでキャッシュの基本設定を実行します。Spring Boot を使用している場合は、Spring Boot がデフォルトのキャッシュ構成を提供するため、通常は追加の構成は必要ありません。

ステップ 1: アノテーション @EnableCaching をスタートアップ クラスに追加する
ステップ 2: アノテーション [@CachePut、@CacheEvict、@Caching] を特定のメソッドに追加する、または @Cacheable アノテーションをメソッドに追加する: キャッシュを必要とするメソッドで @Cacheable を使用する アノテーション、キャッシュ名を指定する、キーおよびその他の情報。

3. キャッシュのトリガー: @Cacheable アノテーションを使用してメソッドを呼び出すと、Spring は対応する結果がすでにキャッシュにあるかどうかを確認します。存在する場合はキャッシュされた結果が直接返され、存在しない場合はメソッド本体が実行され、結果が計算されてキャッシュされます。

2. 詳しい説明

1、@キャッシュ可能

@Cacheable は、メソッドの結果をキャッシュする必要があることを宣言するために使用される Spring Framework のアノテーションです。これにより、メソッド本体を再度実行することなく、キャッシュされた結果を後続の呼び出しで直接返すことができます。このアノテーションは、メソッド、特に計算コストのかかるメソッドの実行効率を向上させるためによく使用されます。

基本的な使い方

import org.springframework.cache.annotation.Cacheable;

public class MyService {
    
    

    @Cacheable(value = "myCache", key = "#input")
    public String getResult(String input) {
    
    
        // 如果缓存中存在以input为key的结果,则直接返回缓存结果
        // 否则,执行方法体,并将结果缓存起来
        // ...
    }
}

上の例では:

getResult メソッドには@Cacheableアノテーションがマークされており、このメソッドの結果がキャッシュされることを示します。
value属性はキャッシュの名前を指定します (複数のキャッシュがあり、それぞれに名前が付いている可能性があります)。
key属性はキャッシュキーを指定する属性で、ここではSpEL(Spring Expression Language)式を使用しており、入力パラメータの値をキャッシュキーとして使用することを意味します。次のように書かれることもあります。

@Cacheable(value = "myCache", key = "#p0+','+#p1")

key = "#p0+','+#p1" : Spring Expression Language (SpEL) 構文を使用して、キャッシュ キーを指定します。#p0 はメソッドの最初のパラメーターを表し、#p1 はメソッドの 2 番目のパラメーターを表します。この例では、キーは最初のパラメータと 2 番目のパラメータをカンマで連結することによって形成されます。これは、メソッドが 2 回呼び出されたときに 2 つのパラメーターが同じ値を持つ場合、同じキャッシュされた結果を共有することを意味します。メソッドを呼び出すたびにキャッシュ値を変更する場合は、ダッシュ、スペース、コロンなどの他の結合文字を使用するか、キー値の一部としてメソッド名を使用できます。

key = "#p0 + '_' + #p1"  // 使用下划线

key = "#p0 + ',' + #p1 + ',' + #p2"  // 添加额外的参数或常量

key = "methodName + ',' + #p0 + ',' + #p1"  //使用方法名作为一部分

予防:

@Cacheable アノテーションは Spring 環境で有効になる必要があるため、通常は Spring 構成ファイルでキャッシュ機能を有効にする必要があります。
メソッドの戻り値の型は、キャッシュに格納できるようにシリアル化可能である必要があります。
キャッシュ キーはキー属性に基づいて生成されるため、メソッドの入力パラメータを一意に識別するようにしてください。
@Cacheable は Spring Cache 抽象化の一部であり、特定のキャッシュ実装はメモリベース、Redis、Ehcache などのさまざまなバックエンドに基づくことができます。
@SqlQuery アノテーションと併用することが多く、メソッドで @Cacheable アノテーションと @SqlQuery アノテーションの両方を使用する場合、通常、実行プロセスは次のようになります。

  • 最初の呼び出し: メソッドが初めて呼び出されるとき、Spring は最初にキャッシュ (
    @Cacheable アノテーションによって管理される) をチェックします。対応する結果がキャッシュに存在する場合は、実際の SQL クエリを実行せずに、キャッシュから直接取得して返されます。

  • キャッシュミス: 対応する結果がキャッシュに存在しない場合、メソッド本体が実行されます。メソッド本体では、SQL クエリ (
    @SqlQuery アノテーションによって管理される) が実行され、クエリ結果がメソッドの戻り値の型にマップされます。

  • 結果のキャッシュ: @Cacheable アノテーションが有効な場合
    、メソッドの実行後、計算結果がキャッシュされるため、次回同じメソッドが呼び出されたときにキャッシュから直接取得できます。

したがって、対応する結果がすでにキャッシュにある場合、実際の SQL クエリは実行されない可能性があります。これにより、データベース アクセスの負荷が効果的に軽減され、メソッドの実行効率が向上します。これら 2 つの注釈を使用する場合は、キャッシュが正しく識別および管理できるように、キャッシュ キーと SQL クエリ パラメーターが混乱を引き起こさないようにしてください。

2、@CacheEvict

@CacheEvict は、キャッシュをクリアするために使用される Spring フレームワークのアノテーションです。これは、メソッドの実行時に指定されたキャッシュ内のデータをクリアするメソッドをマークするために使用されます。@CacheEvict アノテーションの主なプロパティと使用法は次のとおりです。

主な属性:
value (またはcacheNames) : クリアするキャッシュの名前を指定します。これは文字列の配列にすることができます。例: @CacheEvict(value = “myCache”) または @CacheEvict(cacheNames = {“cache1”, “cache2”})。

key : キャッシュ キーの生成に使用される SpEL 式を指定します。例えば:@CacheEvict(value = "myCache", key = "#userI

条件: キャッシュをクリアする条件を SpEL 式で指定します。式の値が false の場合、キャッシュはクリアされません。例えば:@CacheEvict(value = "myCache", condition = "#userId > 0")。

allEntries : true に設定すると、指定されたキャッシュ内のすべてのエントリがクリアされます。例えば:@CacheEvict(value = "myCache", allEntries = true)

beforeInvocation : true に設定すると、メソッドが呼び出される前にキャッシュがクリアされます。false (デフォルト) に設定すると、メソッドが呼び出された後にキャッシュがクリアされます。例えば:@CacheEvict(value = "myCache", beforeInvocation = true)

使用例:

@Service
public class MyService {
    
    

    @CacheEvict(value = "myCache", key = "#userId")
    public void clearCacheByUserId(long userId) {
    
    
        // 此方法执行时,会清除名为 "myCache" 中 key 为 userId 的缓存条目
    }

    @CacheEvict(value = "myCache", allEntries = true)
    public void clearEntireCache() {
    
    
        // 此方法执行时,会清除名为 "myCache" 中的所有缓存条目
    }
}

上記の例では、clearCacheByUserId メソッドは、キー userId を持つ「myCache」という名前のキャッシュ エントリをクリアするために使用され、一方、clearEntireCache メソッドは、「myCache」内のすべてのキャッシュ エントリをクリアするために使用されます。

@CacheEvict アノテーションは通常、メソッドの実行時にキャッシュをクリアするために使用されることに注意してください。メソッドの実行で例外がスローされた場合、beforeInvocation = true が設定されていない限り、キャッシュのクリアは行われない可能性があります。したがって、キャッシュ クリア操作が安全であり、例外によるキャッシュ クリアの失敗が発生しないことを保証する必要があります。

3、@CachePut

@CachePut は、キャッシュを更新するために使用される Spring フレームワークのアノテーションです。これはメソッドをマークするために使用され、メソッドが実行されると結果がキャッシュに配置されます。@Cacheable とは異なり、@CachePut は結果がすでにキャッシュにあるかどうかを最初にチェックせず、メソッドの戻り値を直接キャッシュに入れます

@CachePut アノテーションの主なプロパティと使用法は次のとおりです。

主な属性:
value (またはcacheNames) : 更新するキャッシュの名前を指定します。これは文字列の配列にすることができます。例えば:@CachePut(value = "myCache") 或 @CachePut(cacheNames = {"cache1", "cache2"})

key : キャッシュ キーの生成に使用される SpEL 式を指定します。例えば:@CachePut(value = "myCache", key = "#userId")

条件: キャッシュに配置するための条件 (SpEL 式) を指定します。式の値が false の場合、キャッシュに配置されません。例えば:@CachePut(value = "myCache", condition = "#userId > 0")

until : 条件に反して、式の値が true の場合、キャッシュには配置されません。例えば:@CachePut(value = "myCache", unless = "#result == null")

使用例:

@Service
public class MyService {
    
    

    @CachePut(value = "myCache", key = "#userId")
    public String updateCacheByUserId(long userId) {
    
    
        // 此方法执行时,会将返回值放入名为 "myCache" 中 key 为 userId 的缓存条目
        // 注意:不会先检查缓存中是否已有结果,直接将方法的返回值放入缓存中
        // ...
        return "Updated Value";
    }
}

上記の例では、updateCacheByUserId メソッドを使用して、キー userId を持つ「myCache」という名前のキャッシュ エントリに戻り値を配置します。このメソッドが実行されると、最初にキャッシュに結果があるかどうかを確認せず、メソッドの戻り値を直接キャッシュに入れます。

@CachePut は通常、更新操作後に最新の結果をキャッシュに入れてキャッシュの一貫性を維持するために使用されます。@Cacheable とは異なり、@CachePut はメソッドの実行を妨げず、キャッシュ操作が失敗した場合でもメソッドの通常の実行には影響しないことに注意してください。

4. @Caching
@Caching は、複数のキャッシュ アノテーションを結合するために使用される Spring フレームワークのアノテーションです。@Cacheable、@CachePut、@CacheEvict などの複数のキャッシュ関連のアノテーションを 1 つのメソッドで同時に使用できるため、より柔軟なキャッシュ構成が提供されます。

使用例:

@Service
public class MyService {
    
    

    @Caching(
        cacheable = {
    
    @Cacheable(value = "cache1", key = "#userId")},
        put = {
    
    @CachePut(value = "cache2", key = "#result.id")}
    )
    public User getUserById(long userId) {
    
    
        // 先尝试从 "cache1" 缓存中获取结果
        // 如果获取成功,则返回结果,不执行方法体
        // 如果获取失败,则执行方法体,并将结果放入 "cache1" 和 "cache2" 缓存中
        // ...
        return new User(userId, "John Doe");
    }
}

上記の例では、@Caching アノテーションが @Cacheable アノテーションと @CachePut アノテーションの両方で使用されています。具体的には:

@Cacheable アノテーションを使用して、「cache1」という名前のキャッシュから結果を取得しようとします。取得に成功すると、メソッド本体を実行せずに直接結果が返されます。
@CachePut アノテーションは、同じキーがすでにキャッシュ内にあるかどうかに関係なく、メソッドの戻り値を「cache2」という名前のキャッシュに入れるために使用されます。
@Caching アノテーションを使用すると、複数のキャッシュ アノテーションをより柔軟に組み合わせて、複雑なキャッシュ要件を満たすことができます。

3. キャッシュ有効期限の設定

1. アノテーション属性での設定
@Cacheable アノテーションを使用する場合、expire属性またはexpireAfterWrite属性を設定することでキャッシュの有効期限を設定できます。キャッシュ マネージャーが異なればサポートされる構成も異なるため、これは使用するキャッシュ マネージャーによって異なります。

たとえば、Spring Boot を使用していて、基礎となるキャッシュ マネージャーが Caffeine に基づいている場合は、expireAfterWrite プロパティを使用して有効期限を設定できます。以下に例を示します。

@Cacheable(value = "myCache", key = "#input", expireAfterWrite = 5, timeUnit = TimeUnit.MINUTES)
public String getResult(String input) {
    
    
    // 如果缓存中存在以 input 为 key 的结果,则直接返回缓存结果
    // 否则,执行方法体,并将结果缓存起来,缓存时间为 5 分钟
    // ...
}

上の例では:

expireAfterWrite = 5 は、キャッシュ項目が書き込まれてから 5 分後に期限切れになることを意味します。
timeUnit = TimeUnit.MINUTES は、時間単位が分であることを示します。
正確な構成は、使用するキャッシュ マネージャーによって異なります。EhCache、Redis などの他のキャッシュ マネージャーを使用している場合、特定の構成方法が異なる場合があります。構成ファイルまたは注釈内の関連するプロパティをチェックして、キャッシュの有効期限が正しく設定されていることを確認します。

2. Redis マネージャーの設定
Redis をキャッシュ マネージャーとして使用する場合、Redis キャッシュの有効期限はSpring Boot 構成ファイルまたは Java 構成を通じて設定できます。以下に例を示します。

  • Spring Boot 構成ファイルで Redis キャッシュの有効期限を設定します。
    application.properties または application.yml ファイルに次の構成を追加します。

    # Redis 服务器地址 spring.redis.host=localhost
    # Redis 服务器端口 spring.redis.port=6379
    # 缓存的默认失效时间,单位秒 spring.cache.redis.time-to-live=600
    
  • 上記の設定の spring.cache.redis.time-to-live は、
    デフォルトのキャッシュ有効期限が 600 秒 (10 分) であることを示しています。この値は、@Cacheable アノテーションおよび @CachePut アノテーションによって構成されたすべてのキャッシュに適用されます。

    Java 構成で Redis キャッシュの有効期限を設定する: Java 構成クラスを使用する場合は、構成クラスの RedisCacheConfiguration を通じて
    キャッシュの有効期限を設定できます。以下に例を示します。

     java @Configuration @EnableCaching public class CacheConfig
       extends CachingConfigurerSupport {
          
          
       
           @Bean
           public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
          
          
               RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                       .entryTtl(Duration.ofSeconds(600)); // 设置缓存失效时间为600秒(10分钟)
       
               return RedisCacheManager.builder(connectionFactory)
                       .cacheDefaults(config)
                       .build();
           } } 
    

    上記の構成では、entryTtl(Duration.ofSeconds(600))キャッシュの有効期限を 600 秒に設定することを意味します。この値は、@Cacheable アノテーションおよび @CachePut アノテーションによって設定されたすべてのキャッシュにも適用されます。

特定のニーズに応じて、キャッシュの特性に基づいてさまざまな有効期限を構成できます。上記の例はデモンストレーションのみを目的としており、実際のアプリケーションでは、ビジネス ニーズに応じて適切なキャッシュ有効期限を設定できます。

おすすめ

転載: blog.csdn.net/weixin_45188218/article/details/135131996