即使值存在,也无法单独从 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));
))
);
更新:
我对@987654324@ 没有太多经验。我指出的答案解释了它:
...当我们开始编写
Mono
类型时,计算已经被触发。为了防止不必要的计算,我们可以将未来包装到延迟评估中:... 被困在一个懒惰的供应商中,仅在被请求时才被安排执行。
【讨论】:
不幸的是,这也不起作用。即使 Redis 中存在值,它仍在查询数据库。 @nicholasnet 更新:新方法 我也试过那个,但没有用。但现在我试试你的,它正在工作。因为我尝试了很多东西,所以我忘记了它。但是你给定的解决方案正在工作......所以我很好。非常感谢您的帮助。但出于好奇,为什么我们需要Mono.defer()
?
@nicholasnet 我添加了更新,但解释在我指出的答案中
是的,我后来注意到了。我阅读了链接,非常感谢您的分享。以上是关于即使值存在,也无法单独从 Redis 加载值的主要内容,如果未能解决你的问题,请参考以下文章
即使使用推荐的设置,也无法从渲染器/预加载脚本中访问电子函数
即使 php 代码正在运行,也无法从 MySQL 加载我的数据?