qinfengge

qinfengge

醉后不知天在水,满船清梦压星河
github
email
telegram

Spring Bootにおけるキャッシュ

キャッシュは通常、データベース内で頻繁に使用されるデータを高速化するために使用されます。ほとんどの場合、私たちは redis を使用して MySQL データベースのホットデータをキャッシュします。

EnableCaching#

Spring Boot でキャッシュを使用するのは比較的簡単です。
まず、依存関係を追加します。

<!-- cache 依存関係 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

起動クラスでキャッシュサポートを有効にします。

@SpringBootApplication
@EnableCaching

設定ファイルで redis キャッシュを使用するように指定します。指定しない場合は jvm メモリを使用します。
redis をキャッシュとして使用する前に、redis の接続情報を正しく設定する必要があります。

#cacheing
spring.cache.type=redis
#指定前缀
#spring.cache.redis.key-prefix=test
#指定存活时长
#spring.cache.redis.time-to-live= 1d

最後に、redis の設定クラスに @EnableCaching アノテーションと キャッシュ管理者 を追加します。

/**
     * キャッシュ管理者を宣言します。これにより、アスペクト(aspect)が作成され、Springキャッシュアノテーションのポイントカット(pointcut)がトリガーされます。
     * クラスまたはメソッドで使用されるアノテーションとキャッシュの状態に基づいて、このアスペクトはキャッシュからデータを取得し、データをキャッシュに追加するか、キャッシュから特定の値を削除します。
     *
     * @return
     */
    @Bean
    @SuppressWarnings("all")
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //クエリキャッシュ変換例外の問題を解決します。
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // シリアル化を設定します(文字化けの問題を解決します)。
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(1))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        return RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
    }

キャッシュアノテーション#

キャッシュアノテーション説明
@EnableCachingキャッシュアノテーションのサポートを有効にします。
@CacheConfig一部の設定パラメータを統一して指定するために使用され、他のキャッシュアノテーションで繰り返し指定する必要がなくなります。
@Cacheable以前にキャッシュデータがある場合はキャッシュデータを直接返し、そうでない場合はメソッドを実行し、メソッドの戻り値をキャッシュします。
@CachePutメソッドのリクエストパラメータに基づいてその結果をキャッシュでき、@Cacheable とは異なり、毎回実際のメソッドの呼び出しをトリガーします。
@CacheEvict特定の条件に基づいてキャッシュをクリアできます。
@Caching複数の Cache アノテーションを組み合わせて使用します。

@CacheConfig#

このアノテーションは、統一されたキャッシュパラメータを設定するためによく使用されます。

// コントローラー内でこのアノテーションを使用してキャッシュの名前を指定します。前缀のようなものです。
@CacheConfig(cacheNames = "test")

@Cacheable#

このアノテーションは、クエリメソッドでよく使用されます。このアノテーションを使用すると、最初にキャッシュから検索し、キャッシュにデータがない場合はデータベースから検索し、検索結果をキャッシュに格納します。

Mermaid Loading...

image

// @CacheConfigのグローバルcacheName/valueを設定している場合、ここでは省略できます。
@Cacheable(value = "test", key = "methodName")
// @Cacheableはel式をサポートしています。
@Cacheable(key = "methodName + ':' + #p0 + ':' + #p1")
public Result<Object> getSubordinateAddress(String province,String city){}
@Cacheable(value="users", key="#user.id")
public User find(User user) {}

key がサポートする属性リストは以下の通りです。

属性名説明
methodName現在のメソッド名#root.methodName
method現在のメソッド#root.method.name
target現在呼び出されているオブジェクト#root.target
targetClass現在呼び出されているオブジェクトのクラス#root.targetClass
args現在のメソッドパラメータの配列#root.args[0]
caches現在呼び出されているメソッドが使用しているキャッシュ#root.caches[0].name

@CachePut#

このアノテーションは、キャッシュを更新するためによく使用されます。キャッシュ内の値を無視し、常にメソッドを実行します。
実行順序は、メソッドを呼び出す → 結果を取得する → キャッシュを更新する です。

Mermaid Loading...
@CachePut(value = "myCache", key = "#entity.id")
    public void saveEntity(MyEntity entity) {
        repository.save(entity);
    }

@CacheEvict#

このアノテーションは、対応するキャッシュを削除するために使用されます。

image

@CacheEvict(value = "myCache", key = "#id")
    public void deleteEntityById(Long id) {
        repository.deleteById(id);
    }

allEntries=true を使用する場合、key を無視し、指定された cacheName/value 内のすべての値を削除します。
また、cacheMange オブジェクトを使用して指定されたキャッシュを削除することもできます。以下のコードは、test キャッシュが空でない場合にそれをクリアします。

Objects.requireNonNull(restTemplateConfig.cacheManager(null).getCache("test")).clear();

@Caching#

このアノテーションは、上記の複数のキャッシュアノテーションを組み合わせて使用するために使用されます。

image

@Caching(
        cacheable = {
            @Cacheable(value = "myCache", key = "#id")
        },
        evict = {
            @CacheEvict(value = "otherCache", key = "#id")
        }
    )
    public MyEntity getEntityById(Long id) {
        return repository.findById(id).orElse(null);
    }

呼び出し順序は以下の通りです。

Mermaid Loading...

SpringBoot プロジェクトでキャッシュ Cache を正しく使用する方法!!!
SpringBoot キャッシュ管理 @EnableCaching、@Cacheable

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。