gpt4 book ai didi

java - Spring Flux缓存项是如何管理的

转载 作者:行者123 更新时间:2023-11-30 02:03:07 25 4
gpt4 key购买 nike

考虑代码示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import java.time.Duration;

import static com.google.common.collect.ImmutableMap.of;

@Component
public class Scratch {

@Autowired
private WebClient webClient;

public Mono<MyClass> getMyClass(Long id) {
return webClient.get()
.uri("{id}", of("id", id))
.retrieve()
.bodyToMono(MyClass.class)
.cache(Duration.ofHours(1));
}
}

规范tells :

Will retain an unbounded history but apply a per-item expiry timeout

什么是项目以及缓存什么?

  1. 整个 http 调用都会被缓存。例如。如果我调用方法链 .get().uri()id = 1任何后续调用都会被缓存吗?或
  2. Mono<MyClass>已缓存。例如。任何后续调用 Mono.map会使用缓存值吗?

在这两种情况下,什么被视为项目?

最佳答案

Reactor 中的 cache 运算符与组件方法上的 @Cacheable 注释非常不同。

例如,@Cacheable 注释将:

  • 拦截方法调用并根据方法参数计算缓存键
  • 调用该方法并将结果存储在外部缓存中
  • 每当其他东西使用相同的参数调用该方法时提供缓存的结果

所有 Reactor 运算符都是装饰器,它们返回 Flux/Mono 的新实例 - this is why you need to chain operators .

让我们举个例子:

Scratch scratch = //...
Mono<MyClass> myClass = scratch.getMyClass(12L);

这意味着每次有东西订阅特定的 Mono 实例(因此不是 scratch.getMyClass(44L);,也不是另一个 返回的任何其他实例scrap.getMyClass(12L); 调用),Reactor 会返回第一次消费时缓存的元素。

当 Reactor 谈论元素时,这些是 MyClass 消息的实例;因为这里,缓存操作符被添加到了bodyToMono之后。如果您要将该运算符添加到管道中的其他位置,那就会是一个不同的故事,即它将缓存不同的东西。

现在,此功能不会为所有类似的 HTTP 调用实现 HTTP 客户端缓存。如果应用程序的多个部分需要完全相同的数据,并且您不想浪费资源一遍又一遍地获取相同的数据,则此功能非常有用。

例如,假设此 HTTP 调用成本较高,并且您希望在多个位置使用该 MyClass 实例:

Mono<MyClass> myClass = scratch.getMyClass(12L);
Mono<Void> result = saveToDatabase(myClass).then(calculateStats(myClass));

另一个用例是当您想要向多个客户端共享数据流时:

@RestController
public class StreamingController {

private Flux<StockQuotes> quotes = quoteService.fetch().cache(Duration.ofSeconds(5));

@GetMapping("/quotes")
public Flux<StockQuotes> streamQuotes() {
return this.quotes;
}

在这种情况下,每次新的 HTTP 客户端请求服务器并从中传输数据时,服务器都不会创建到远程股票服务的新连接,并且会重播最后 5 秒的报价(然后对于所有新订阅,继续执行其余操作。

关于java - Spring Flux缓存项是如何管理的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52171581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com