🦔

Spring CacheとCaffeineで複数のCacheMangagerを利用する

2022/10/08に公開

環境

  • Spring Boot: 2.7.4
  • Kotlin: 1.6.21
  • Gradle

キャッシュにはCaffeineを使用する

https://github.com/ben-manes/caffeine

準備

以下の2つを追加する

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-cache")
    implementation("com.github.ben-manes.caffeine:caffeine")
}

CacheManagerの定義

CachingConfigurerSupportを継承したクラスを用意し、そこにCacheManagerを定義する

CacheConfig.kt
@Configuration(proxyBeanMethods = false)
@EnableCaching
class CacheConfig: CachingConfigurerSupport() {

    @Bean
    override fun cacheManager(): CacheManager = CaffeineCacheManager().apply {
        setCaffeine(Caffeine.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS))
    }

    @Bean
    fun fooCacheManager(): CacheManager = 
    // fooはキャッシュ名
    CaffeineCacheManager("foo").apply {
        setCaffeine(Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.SECONDS))
    }

}

CacheManagerを指定したキャッシュ設定

@Cacheable#cacheManagerにCacheManager名を指定する

@Cacheable(cacheNames = ["foo"], cacheManager = "fooCacheManager")
fun getFoo(foo: String): Foo {...}

CacheManagerを指定しないキャッシュ設定

@Cacheable#cacheManagerを未設定にすればOK
未指定の場合、CacheConfig#cacheManagerに定義したCacheManegerが利用される

@Cacheable(cacheNames = ["bar"])
fun getBar(bar: String): Bar {...}

Discussion