gpt4 book ai didi

java - react 性 : Caching service response for few hours

转载 作者:行者123 更新时间:2023-11-30 05:45:39 28 4
gpt4 key购买 nike

因此,我的应用程序将多次调用下面昂贵的 HTTP 服务(对于每个客户端向我的应用程序的请求,同时通过具有相同和不同 ID 的多个线程)。

Mono<Foo> response = myService.fetch(id);

我想将响应缓存(在内存中)几个小时,然后仅在下一个客户端请求时仅进行一次调用来刷新缓存。

方法 1:

Mono<Foo> cachedResponse = Mono.empty();

public Mono<Foo> get(String id){
return cachedResponse.switchIfEmpty(Mono.defer(()->
{
cachedResponse = myService.fetch(id).cache(Duration.ofHours(4));
return cachedResponse;
}));
}

下面的方法可以吗?具体来说,因为多个线程可以调用具有相同 id 的 get 方法。另外,当缓存在4小时后失效时,是否会将cachedResponse Mono清空以使switchIfEmpty正常工作?

方法 2:我可以使用一些缓存解决方案来存储缓存几个小时。例如

Foo getFromCacheSolution(String id);

然后,

public Mono<Foo> get(String id){
Foo cachedFoo = getFromCacheSolution(id);
if(cachedFoo != null){
return Mono.just(cachedFoo);
}
else{
return myService.fetch(id).doOnNext(value->storeToCacheSolution(id, value)); //line 7
}
}

此解决方案的问题在于,第 7 行将被多次调用,从而导致多次调用昂贵的 fetch 服务(例如,如果 3 个线程进入 id 为 123 的 get 方法,并且 cachedFoo 为 null)。使方法同步可能没有帮助,因为第 7 行会立即完成。

一种解决方法是将 Mono 而不是 Foo 存储在缓存解决方案中(不确定这是否是一个好主意):

Mono<Foo> getFromCacheSolution(String id); //returns cached or empty Mono

然后,

public Mono<Foo> get(String id){
return getFromCacheSolution(id).switchIfEmpty(Mono.defer(()->
{
cachedResponse = myService.fetch(id).doOnNext(value->storeToCacheSolution(id, value));
return cachedResponse;
}));
}

有什么建议或更好的选择吗?

最佳答案

您的问题由两部分组成:关于缓存和关于具有相同参数的调用的独占锁定。

  1. 缓存。

    您的第二种方法适用于内存缓存。或者,您可以使用 reactor-extra 中的 CacheMono

    Mono<Foo> myFoo =
    CacheMono.lookup(key -> Mono.justOrEmpty(myCache.getIfPresent(key))
    .map(Signal::next), id)
    .onCacheMissResume(() -> myService.fetch(id))
    .andWriteWith((key, signal) -> Mono.fromRunnable(() ->
    Optional.ofNullable(signal.get())
    .ifPresent(value -> myCache.put(key, value))));
  2. 对具有相同参数的调用进行独占锁定。

    通常我们应该避免在响应式世界中进行任何锁定。但如果你真的需要它,你的锁应该是非阻塞的。我不知道任何库,但您可以在 this question thread 中找到一些想法和示例链接。

关于java - react 性 : Caching service response for few hours,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54890685/

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