【问题标题】:Spring Cache perform action after expiresSpring Cache 过期后执行操作
【发布时间】:2021-12-21 17:26:43
【问题描述】:

我使用 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
}

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

【问题讨论】:

    标签: kotlin spring-cache caffeine-cache


    【解决方案1】:

    默认情况下,过期被视为缓存上其他活动触发维护周期的副作用。如果缓存空闲,则通知将被延迟。要解决此问题,您将需要一个线程来安排到期事件,以便它可以触发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()))
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多