当前位置: 首页 > 知识库问答 >
问题:

咖啡因异步缓存与Spring Boot缓存管理器

李鹏
2023-03-14

我试图使用Spring BootCacheManager与咖啡因和一些@Cacheable注释函数。在我们的测试中,对控制器endpoint的异步调用出现了一些问题,这些问题似乎与我们使用非异步缓存的事实有关。

在做一些研究时,我看到了很多使用Caffeine手动使用CompletableFuture的例子,但是在AsyncCacheLoader和Spring BootCacheManager@Cacheable注释中找不到任何东西。看起来CacheAsyncCache具有非常不同的API。是否可以异步使用默认的Spring BootCacheManager

谢谢

共有1个答案

步兴德
2023-03-14

在Ben Manes发表评论后更新答案。您可以将@Cacheable与Spring Boot缓存管理器一起用于反应式Spring Webflux,但在引擎盖下面,值存储在同步缓存中。这里有一个例子

@RestController
@SpringBootApplication
@EnableCaching
public class GatewayApplication {

 @PostMapping(value ="/test", produces = "application/json")
 public Flux<String> handleRequest(@RequestBody String body) {
    return getData(body);
 }

 @Cacheable("cache")
 private Flux<String> getData(String body) {
    return WebClient.create().post()
            .uri("http://myurl")
            .body(BodyInserters.fromObject(body))
            .retrieve().bodyToFlux(String.class).cache();
 }
}

正如您在上面的例子中看到的,它使用Spring WebFlow(项目反应器)和@Cacheable方法返回异步的Flux。

如果您希望在存储CompleteableFutures时使用反应式缓存,则可以直接使用AsyncCache

 类似资料:
  • 我在java Play Framework作业中使用Caffeine cache实现来缓存传出的http请求,我看到,尽管缓存已经启动并运行,但我的服务仍然每次都访问外部服务器,而不是返回缓存中的值。我看到记录在日志中的键总是相同的。 所以我看到没有设置,所以这可能意味着缓存立即过期。但我仍然不知道如何在配置中设置它 我没有更改我的java代码,如果我需要这样做,我找不到任何示例,或者我只应该有一

  • 我已经使用咖啡因缓存设置了一个场景,但我无法让它工作,当参数相同时,总是调用真正的方法。这是我的配置: 波姆。xml CacheManager的配置类 然后是具有可缓存方法的类: 我还尝试将缓存名称添加到可缓存批注: 并将移动到Spring Boot主应用程序类。 真正的方法总是被调用的。 你知道我做错了什么吗? 谢谢

  • 我目前正在学习咖啡因,总体来说我对Spring还不熟悉。我一直在尝试用咖啡因实现缓存;然而,我发现自己遇到了几个问题。 我看到了两种配置咖啡因缓存的方法。 首先是Java类: 第二是在应用范围内。财产: 我想问一下,这两者之间有什么不同之处吗?我需要课程和应用程序吗。属性配置,还是仅其中一个?此外,在Java类实现中,cacheManager是仅应用于名为“example”的缓存,还是应用于每个缓

  • 使用咖啡因2.8.1和Java8。我已经创建了 如果值为。 问题#1:基于我想要实现的目标,我的过期策略看起来是否正确? 问题#2: 我没有看到按照逐出策略调用。这可能是由于github问题中所述的清理任务的累积。 然而,我的代码的正确性取决于这样一个事实:一个条目的过期时间(如果值为10分钟)已经过去,并且如果我们调用则不应从缓存返回过期值,而是调用即keyExistsOnServer(key)

  • 从Java8开始,我们可以在ConcurrentHashMap上使用。compute*方法来按键同步处理,这样,如果两个线程同时在同一个键上执行。compute*方法,回调仍然会相继执行,而不是同时执行。但是ConcurrentHashMap不能像缓存通常允许的那样提供及时删除数据的能力。 Guava/Caffeine缓存提供了基于时间的自动删除值的能力,但是您没有基于键的同步处理的讨厌特性,如在

  • 我正在使用咖啡因缓存,并寻找一种方法来更新缓存中的值,而不更改其过期时间。 场景是我使用缓存来加速数据加载。数据更改延迟5秒是可以接受的,而我希望返回速度很快。此外,我希望这些缓存在第一次命中1天后过期,以避免不必要的内存使用。 因此,我希望每个缓存的密钥持续一天,但其值每5秒更新一次。 方法似乎已关闭,但刷新持续时间后的第一个返回值仍然是旧值。这对我来说并不理想,因为两次点击之间的持续时间可能是