java - 即使存在值,也无法单独从 Redis 加载值
问题描述
我正在使用 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 中存在值,调用也总是会访问数据库。我在这里做错了什么?
解决方案
基于此答案,您可以尝试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
类型时,计算已经被触发了。为了防止不必要的计算,我们可以将未来包装到延迟评估中:...被困在一个懒惰的供应商中,并且仅在需要时才安排执行。
推荐阅读
- amazon-web-services - 没有 UI 表单的非交互式 ALB 身份验证?
- sql - Active Record 发现多对多缺失
- mysql - 错误 错误:ER_BAD_FT_COLUMN:列“大小”不能是 FULLTEXT 索引的一部分
- javascript - 为什么这些筛子优化会破坏我的代码?
- python - 给定两个矩阵和一个带有两个向量的函数,如何向量化矩阵中每对向量的函数均值?
- c++ - 恢复生命周期已结束的对象的成员函数协程是UB吗?
- java - 访问扩展通用数组列表中的对象变量
- swift - 使用嵌套 UIView 动画缩放 UIView
- laravel - Laravel生成pdf时如何设置语言
- javascript - 将 React 类组件转换为具有许多回报的功能组件