繁体   English   中英

即使存在值,也无法单独从 Redis 加载值

[英]Unable to load value from Redis alone even if value is present

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

然而,即使 Redis 中存在 value,它仍然一直在查询数据库。

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 中存在值,调用也总是会访问数据库。 我在这里做错了什么?

基于此答案,您可以尝试使用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类型时,计算已经被触发。 为了防止不必要的计算,我们可以将我们的未来包装成延迟评估:

... 被困在一个懒惰的供应商中,只有在被请求时才安排执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM