首页 > 解决方案 > 是否可以调整 Caffeine LoadingCache 以与 Spring Boot 的 @Cacheable 一起使用?

问题描述

我正在开发一个大型 Spring Boot 2.1.5.RELEASE 应用程序,使用 Caffeine 作为缓存提供程序。为了防止 I/O 瓶颈,我LoadingCache<K,V>以(基本上)以下方式使用咖啡因:

LoadingCache<K, V> cache = Caffeine.newBuilder()
    .refreshAfterWrite(1, TimeUnit.MINUTES)
    .build(loadStuffOverHttp());

据我所知,如果不使用LoadingCache.

但是,LoadingCache 没有实现 Spring 的Cache. 这意味着我不能依赖@Bean方法来注册我的缓存,每个方法都需要进行不同的配置。理论上,在 Spring 上下文中注册将允许它们与 Spring 的@Cacheable注释一起使用。

CaffeineCacheConfiguration.java的源代码中可以看出,我也不能依赖 Spring Boot 的自动配置。类型的 Bean CaffeineCache(Spring 的Caffeine的缓存适配器模式Cache<K,V>)是自动注册的,但是适配器强制我将其<Object, Object>用作 my 的泛型类型CacheLoader<K, V>。我只想将其作为最后的手段。

这个 SO question表明可以以编程方式配置不同的缓存:

只需将您的自定义缓存公开为 bean。它们会自动添加到CaffeineCacheManager.

但是,使用LoadingCache<K, V>(使用任意K, V, not <Object, Object>)执行此操作似乎更难。

这个 SO question似乎表明使用 aSimpleCacheManager而不是 aCaffeineCacheManager是可能的 - 但是使用这个解决方案需要CacheLoader定义对Cachebean 可用。这可能很容易首先需要使用缓存注入服务@Cacheable,例如在昂贵的 HTTP 调用的情况下。这似乎也是一个容易产生依赖循环的解决方案,但如果不是这种情况,请纠正我。

问题

LoadingCache<K, V>定义用于 Spring 的Caffeine 的正确方法是@Cacheable什么?

标签: javaspringspring-bootcachingcaffeine

解决方案


推荐阅读