0

我使用 Caffeine 作为与 Spring Cache 集成的缓存管理器,以避免多次不必要的文件下载。下载文件后,我就有了它的路径,该路径由下载方法返回。

一旦缓存过期,我想删除文件。我试过了,removalListener但似乎只有在手动清除缓存时才会触发。

这是我的缓存配置:

@Bean
fun getCacheBuilder() = Caffeine.newBuilder()
    .expireAfterWrite(3, TimeUnit.SECONDS)
    .removalListener { _: Any?, filePath: Any?, _: RemovalCause ->
        Files.delete(Paths.get(filePath.toString()))
    }

@Bean
fun getCacheManager(caffeine: Caffeine<Any, Any>): CacheManager {
    val caffeineCacheManager = CaffeineCacheManager("myStoredData")
    caffeineCacheManager.setCaffeine(caffeine)
    return caffeineCacheManager
}

这段代码有问题吗?有没有办法在缓存过期时自动触发监听器?

4

1 回答 1

0

默认情况下,过期被处理为缓存上其他活动触发维护周期的副作用。如果缓存空闲,则通知将被延迟。要解决此问题,您将需要一个线程来安排到期事件,以便它可以触发cache.cleanUp()调用。这可以使用Caffeine.scheduler(Scheduler)配置来完成。它systemScheduler依赖于 JVM 范围的调度程序线程的 Java 9+ 特性。

Caffeine.newBuilder()
    .expireAfterWrite(3, TimeUnit.SECONDS)
    .scheduler(Scheduler.systemScheduler())
    .removalListener { _: Any?, filePath: Any?, _: RemovalCause ->
        Files.delete(Paths.get(filePath.toString()))
    }
于 2021-12-21T18:02:49.560 回答