はじめに
Spring Bootアプリケーションのローカルキャッシュを実現する必要が出たので、Spring Cacheを使用して実現する方法を調べた情報・実装例をまとめて記事にします。
以下の内容を記載します。
- Spring Cacheの実装例
- Cacheの設定例
実行環境
以下の環境で動作確認しています。
- OpenJDK 17
- spring-boot-stater-cache 4.1.0
- caffeine 3.2.4
Spring Cacheとは
SpringFrameworkが提供するキャッシュ機能を使用してSpring Bootアプリケーションにアノテーションベースでキャッシュ機能を提供する仕組みです。@Cachebleのようなアノテーションをメソッドに付与するだけで動作し、CaffeineやRedisとような個別のキャッシュ機能を意識せずに切りかえられる抽象化レイヤーとして機能します。DBアクセスや外部API呼び出しなどの重い処理の結果を再利用して、アプリケーションのレスポンス速度向上や負荷軽減を実現できます。
実装例
以下のようにキャッシュしたいメソッドに対して@Cacheableのアノテーションを付与することで機能します。キャッシュのキーとなる属性も指定可能です。
@Cacheable(cacheNames = "BookCache")
public List<Book> findAll() {
return bookRepository.findAll();
}
@Cacheable(cacheNames = "BookCache", key = "#id")
public Book findById(Long id) {
return bookRepository.findById(id);
}
また、キャッシュを有効化するために@EnableCachingの付与も必要です。
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Cacheの動作設定
キャッシュの動作設定はapplication,ymlに記載する方法とJavaファイルに記載する方法があります。
キャッシュで保持するレコードの最大エントリー数、キャシュの保持期限を設定することが可能です。
※以下はどちらもBookCacheに最大エントリー数100、キャッシュの保持期限120秒を設定する例です。
application.ymlに記載する方法
spring:
cache:
cache-names: BookCache
caffeine:
spec: maximumSize=100, expireAfterWrite=120s
Javaファイルに記載する方法
複数のキャッシュを利用し、個々のキャッシュごとに異なる設定を行う場合にはこちらのJavaのConfigを作成する方法を採用してください。(application.ymlの場合はspecに記載した設定はすべてのキャッシュで共有されるためです。)
@Configuration
public class CacheConfig {
public CacheManager cacheManager() {
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
caffeineCacheManager.registerCustomCache("BookCache",
Caffeine.newBuilder().maximumSize(100).expireAfterWrite(120, TimeUnit.SECONDS).recordStats().build());
return caffeineCacheManager;
}
}
まとめ
Spring Bootアプリケーションでキャッシュを有効化する実装例をまとめました。
キャッシュの設定などは要件に応じて色々といじる必要が出てきそうですね。設定の考慮部分が多い印象ですが、基本的に実装はアノテーションを付与するだけでキャッシュを実現できる便利な機能だと感じました。
参考文献