しおしお

IntelliJ IDEAのことなんかを書いてます

Spring Bootなアプリケーションのキャッシュの内容を定期的にクリアしてみる

@Scheduled アノテーションを使ってタスクを定期実行し、キャッシュの値を定期的にクリアしています。

設定値(application.properties)

  • 簡単に確認出来るインメモリキャッシュを設定しています
spring.cache.type=simple

サンプルコード

  • @Scheduled で10秒毎にキャッシュをクリアするタスクを実行しています
  • 同時に@CacheEvictを設定して、削除対象のキャッシュ名とすべてのエントリを削除するようにしています
@SpringBootApplication
@EnableCaching
@EnableScheduling
class CacheDemoApplication

fun main(args: Array<String>) {
    runApplication<CacheDemoApplication>(*args)
}

@RestController
@RequestMapping("/sample")
class SampleController(private val sampleService: SampleService) {
    val logger = LoggerFactory.getLogger(SampleController::class.java)
    @GetMapping
    fun toUpper(@RequestParam("value") value: String): String {
        logger.info("value: $value")
        return sampleService.toUpper(value)
    }

}

@Service
class SampleService {

    val logger = LoggerFactory.getLogger(SampleService::class.java)

    @Cacheable("toupper")
    fun toUpper(value: String): String {
        TimeUnit.SECONDS.sleep(1)
        val upper = value.toUpperCase()
        logger.info("$value --> $upper")
        return upper
    }
}

@Component
class SampleClearCache {

    val logger = LoggerFactory.getLogger(SampleClearCache::class.java)

    @Scheduled(fixedRateString = "PT10S", initialDelayString = "PT10S")
    @CacheEvict(value = ["toupper"], allEntries = true)
    fun clearCache(): Unit {
        logger.info("clear cache")
    }
}

実行結果

  • 初回はServiceが実行され、それ以降はServiceの実行が行われずキャッシュの値が使われていることがわかります
  • スケジュールなタスクでキャッシュのクリアが行われると、Serviceが実行されていることがわかります
  • スケジュールなタスクが指定された時間(10秒)毎に実行されていることがわかります
2019-03-23 07:28:07.930  INFO 26010 --- [nio-8080-exec-7] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:08.931  INFO 26010 --- [nio-8080-exec-7] siosio.cachedemo.SampleService           : a --> A
2019-03-23 07:28:09.220  INFO 26010 --- [nio-8080-exec-8] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:09.993  INFO 26010 --- [nio-8080-exec-9] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:10.665  INFO 26010 --- [io-8080-exec-10] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:11.680  INFO 26010 --- [nio-8080-exec-2] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:12.399  INFO 26010 --- [nio-8080-exec-1] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:13.220  INFO 26010 --- [nio-8080-exec-3] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:14.013  INFO 26010 --- [nio-8080-exec-4] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:14.820  INFO 26010 --- [nio-8080-exec-5] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:15.703  INFO 26010 --- [   scheduling-1] siosio.cachedemo.SampleClearCache        : clear cache
2019-03-23 07:28:15.715  INFO 26010 --- [nio-8080-exec-7] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:16.716  INFO 26010 --- [nio-8080-exec-7] siosio.cachedemo.SampleService           : a --> A
2019-03-23 07:28:17.837  INFO 26010 --- [nio-8080-exec-8] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:20.011  INFO 26010 --- [nio-8080-exec-9] siosio.cachedemo.SampleController        : value: a
2019-03-23 07:28:25.703  INFO 26010 --- [   scheduling-1] siosio.cachedemo.SampleClearCache        : clear cache