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

Posted

技术标签:

【中文标题】即使值存在,也无法单独从 Redis 加载值【英文标题】:Unable to load value from Redis alone even if value is present 【发布时间】:2020-06-18 13:52:34 【问题描述】:

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

【问题讨论】:

也许尝试将这个reactiveRedisOperations.opsForValue() 提取到变量并在这两个地方使用? 你能举个例子吗,因为我在这里使用 Mono。 【参考方案1】:

基于this answer,你可以试试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)); 
        ))
    );

更新:

我对@9​​87654324@ 没有太多经验。我指出的答案解释了它:

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

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

【讨论】:

不幸的是,这也不起作用。即使 Redis 中存在值,它仍在查询数据库。 @nicholasnet 更新:新方法 我也试过那个,但没有用。但现在我试试你的,它正在工作。因为我尝试了很多东西,所以我忘记了它。但是你给定的解决方案正在工作......所以我很好。非常感谢您的帮助。但出于好奇,为什么我们需要Mono.defer() @nicholasnet 我添加了更新,但解释在我指出的答案中 是的,我后来注意到了。我阅读了链接,非常感谢您的分享。

以上是关于即使值存在,也无法单独从 Redis 加载值的主要内容,如果未能解决你的问题,请参考以下文章

即使符号存在于 .so 文件中也无法加载符号? [复制]

即使将其加载到内存中,也无法从 kernel.s 打印

即使使用推荐的设置,也无法从渲染器/预加载脚本中访问电子函数

即使 php 代码正在运行,也无法从 MySQL 加载我的数据?

即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]

redis模块