gpt4 book ai didi

java - 如何打开单声道

转载 作者:行者123 更新时间:2023-11-30 12:02:04 26 4
gpt4 key购买 nike

我是 Webflux 的新手,我正在尝试实现这个场景:

  • 客户要求数据
  • 如果数据已经存在于 redis 缓存中 => 返回缓存数据
  • 否则向远程服务查询数据

我写了这段代码:

ReactiveRedisOperations<String, Foo> redisOps;

private Mono<Foo> getFoo(String k) {

return this.redisOperations.opsForValue().get(k)
.map(f -> this.logCache(k, f))
.switchIfEmpty(this.queryRemoteService(k));
}

private void logCache(String k, Foo f) {
this.logger.info("Foo # {} # {} present in cache. {}",
k,
null != f ? "" : "NOT",
null != f ? "" : "Querying remote");
}

private Mono<Foo> queryRemoteService(String k) {

this.logger.info("Querying remote service");

// query code
}

它打印:

"Querying remote service"
"Foo # test_key # present in cache"

如何确保仅当缓存数据不存在时才调用 switchIfEmpty

编辑

根据 Michael Berry 的回答,我重构了我的代码,如下所示:

private Mono<Foo> getFoo(String k) {

this.logger.info("Trying to get cached {} data", k);

this.logger.info(this.redisOps.hasKey(k).block() ? "PRESENT" : "NOT present");

return this.redisOperations.opsForValue().get(k)
.switchIfEmpty(this.queryRemoteService(k));
}

private Mono<Foo> queryRemoteService(String k) {

this.logger.info("Querying remote service");

// query code
}

现在我的输出是这样的:

Trying to get cached test_key data
PRESENT
Querying provider

所以看起来只执行了一次,但还是避免不了switchIfEmpty被执行。我确定 redis 包含该键的数据

最佳答案

这一行:

.map(f -> this.logCache(k, f))

...很奇怪,因为您没有将任何东西映射到任何东西,而是在执行副作用(记录值)。doOnNext()(而不是 map()) 在这里会是一个更明智的选择。

但是,我离题了,这不是这里的主要问题。

How can I ensure that switchIfEmpty is called only if cached data is not present?

已经是那样了,但是您的日志记录并没有按照您的想法进行。可能在这里引起问题的关键概念是 null 永远不能通过 react 流传播。如果像本例中那样流,则根本不会传播任何内容。

因此,在您的代码中,既不会调用 map()(也不会调用 doOnNext()),因此您的“存在于缓存中”行获胜不会被写入日志(因为没有要映射的值,也没有要调用副作用的值。)因此,检查 logCache() 中的值是否为 null 毫无意义 - 它永远不会为空。

据我所知,您的日志输出因此必须是两次调用 getFoo() 的结果:

  • 第一个不存在于缓存中,因此未调用 map(),切换了 switchIfEmpty(),并打印了“查询远程服务”;
  • 第二个存在于缓存中,因此打印了“存在于缓存中”行,未调用 switchIfEmpty(),因此未打印“查询远程服务”。

为了使您的日志记录有意义,您应该从 logCache() 中删除条件逻辑,并向 queryRemoteService() 添加“not present in cache”行方法。

关于java - 如何打开单声道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58974349/

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