0

我正在使用 Reactive Redis,我试图将 Redis 用作数据库的缓存。我正在检查缓存中是否存在值?如果存在则返回它,否则如果结果返回则查询数据库;存储结果缓存它并返回它。

但是,即使 Redis 中存在值,它仍然一直在查询数据库。

public Mono<User> getUser(String email) {
    return reactiveRedisOperation.opsForValue().get("tango").switchIfEmpty(
        // Always getting into this block (for breakpoint) :(
        queryDatabase().flatMap(it -> {
            reactiveRedisOperation.opsForValue().set("tango", it, Duration.ofSeconds(3600)).then(Mono.just(it)); 
        })
    );
}

private Mono<User> queryDatabase() {
    return Mono.just(new User(2L,"test","test","test","test","test",true,"test","test","test"));
}

但是,即使 Redis 中存在值,调用也总是会访问数据库。我在这里做错了什么?

4

1 回答 1

1

基于此答案,您可以尝试Mono.defer

public Mono<User> getUser(String email) {
    return reactiveRedisOperation.opsForValue().get("tango").switchIfEmpty(Mono.defer(() -> {
        // Always getting into this block (for breakpoint) :(
        queryDatabase().flatMap(it -> {
            reactiveRedisOperation.opsForValue().set("tango", it, Duration.ofSeconds(3600)).then(Mono.just(it)); 
        })})
    );
}

更新:

我没有太多经验Mono。我指出的答案解释了它:

...当我们开始编写我们的Mono类型时,计算已经被触发了。为了防止不必要的计算,我们可以将未来包装到延迟评估中:

...被困在一个懒惰的供应商中,并且仅在需要时才安排执行。

于 2020-03-06T11:55:34.040 回答